Viac

Ako vypočítam vzdialenosť na Manhattane pomocou PostGIS?

Ako vypočítam vzdialenosť na Manhattane pomocou PostGIS?


Používam funkciu ST_Distance na výpočet vzdialenosti medzi dvoma geometriami (vlaková stanica a budova). Pretože viem, že všetky budovy a všetky vlakové stanice sú v Chicagu, ktoré má vynikajúcu / úplnú uličnú mriežku, chcel by som použiť Manhattan (alebo taxík) vzdialenosť.

Všeobecný vzorec pre to je rozdiel v X plus rozdiel v Y, teda Abs (X1-X2) + Abs (Y1-Y2).

Aký dotaz PostgreSQL by umožnil, aby to fungovalo?


Na svoju otázku odpovedám navrhnutým dotazom.

vyberte *, ABS (x_permit-x_station) + ABS (y_permit-y_station) ako manhattan FROM (SELECT longname AS NAME, lines AS metadata, T .slug, ST_Distance (T .geom, ST_Transform (P .geometry, 3435)) AS distance , ST_X (ST_Transform (p.geometry, 3435)) ako x_permit, ST_Y (ST_Transform (p.geometry, 3435)) ako y_permit, ST_X (t.geom) ako x_station, ST_Y (t.geom) ako y_station FROM umožňuje P, station_cta T KDE P .permit_ = '100533644' OBJEDNAŤ NA OBDOBIE LIMIT 2) ako foo

Výsledkom budú niektoré stĺpce vyrezané:

Kedzie-Ravenswood Brown Line 3738.52830193659 3796.29623843171 Addison-O'Hare Blue Line 4105.37381385087 5790.20002649655

Prvý očíslovaný stĺpec je vzdialenosť (v stopách, pretože používam EPSG 3435) vypočítaná funkciou ST_Distance PostGIS a druhý očíslovaný stĺpec je výsledkom vzorca pre vzdialenosť na Manhattane.

Na mieste som skontroloval druhý výsledok a získal som pešiu vzdialenosť od služby Mapy Google medzi stanicou CTA Addison Blue Line a budovou na adrese 3226 W Belle Plaine Ave (v dotaze označená ako „100533644“). Mapy Google vyprodukovali 1,1 míle pešej trasy, zatiaľ čo výsledok Postgres 5 790 stôp = 1,09 míle. Rozdiel je pre moje účely prijateľný.


Myslím, že som našiel aj trochu elegantnejšie riešenie, ktoré využíva trigonometriu a zabudované riešenieST_Azimuthfunkciu a zapuzdril do peknej funkcie:

VYTVORIŤ ALEBO VYMENIŤ FUNKCIU JZ_TaxiCab (geometria p1, geometria p2) NÁVRATNOSTI SKUTOČNÉ AKO $$ DEKLARÁCIA az REÁLNE; h SKUTOČNÉ; ZAČIATOK az: = ST_Azimuth (p1, p2); / * Obsadenie do geografie, aby ste získali výsledok v metroch * / h: = ST_Distance (p1 :: geografia, p2 :: geografia); / * Poznámka: musíme brať abs (), pretože hodnoty vrátené pomocou môžu byť kladné alebo záporné. Skutočne nás nemusí nevyhnutne zaujímať referenčný bod, pretože to bude pravý trojuholník. * / NÁVRAT h * abs (sin (az)) + h * abs (cos (az)); KONIEC; $$ JAZYK plpgsql

之 笔记 之 Vyhľadávanie najbližších susedov pomocou PostGIS

PostgreSQL: Dokumentácia: 10: 7,8. S dotazmi (spoločné výrazy tabuľky)

  • https://www.postgresql.org/docs/10/static/queries-with.html#QUERIES-WITH-SELECT
  • WITH poskytuje spôsob zápisu pomocných príkazov na použitie vo väčšom dotaze. Tieto príkazy, ktoré sa často označujú ako Common Table Expressions alebo CTE, možno považovať za definovanie dočasných tabuliek, ktoré existujú iba pre jeden dotaz. Každý pomocný príkaz v klauzule WITH môže byť SELECT, INSERT, UPDATE alebo DELETE a samotná klauzula WITH je pripojená k primárnemu príkazu, ktorým môže byť tiež príkaz SELECT, INSERT, UPDATE alebo DELETE.

Vypočítajte minimálnu vzdialenosť medzi bodmi v databáze výmeny zásobníkov PostGIS - Geographic Information Systems

  • ST_Distance - For geometry type Vráti 2D karteziánsku vzdialenosť medzi dvoma geometriami v premietaných jednotkách (na základe priestorovej referencie). Pri predvolenom nastavení typu zemepisu sa má vrátiť minimálna geodetická vzdialenosť medzi dvoma geografickými oblasťami v metroch.

Boundless: Úvod do PostGIS: 27. Vyhľadávanie najbližších susedov

Boundless: Úvod do PostGIS: 29. Advanced Geometry Constructions


之 笔记 之 Vyhľadávanie najbližších susedov pomocou PostGIS

PostgreSQL: Dokumentácia: 10: 7,8. S dotazmi (spoločné výrazy tabuľky)

  • https://www.postgresql.org/docs/10/static/queries-with.html#QUERIES-WITH-SELECT
  • WITH poskytuje spôsob zápisu pomocných príkazov na použitie vo väčšom dotaze. Tieto príkazy, ktoré sa často označujú ako Common Table Expressions alebo CTE, možno považovať za definovanie dočasných tabuliek, ktoré existujú iba pre jeden dotaz. Každý pomocný príkaz v klauzule WITH môže byť SELECT, INSERT, UPDATE alebo DELETE a samotná klauzula WITH je pripojená k primárnemu príkazu, ktorým môže byť tiež príkaz SELECT, INSERT, UPDATE alebo DELETE.

Vypočítajte minimálnu vzdialenosť medzi bodmi v databáze výmeny zásobníkov PostGIS - Geographic Information Systems

  • ST_Distance - For geometry type Vráti 2D karteziánsku vzdialenosť medzi dvoma geometriami v premietaných jednotkách (na základe priestorovej referencie). Pri predvolenom nastavení typu zemepisu sa má vrátiť minimálna geodetická vzdialenosť medzi dvoma geografickými oblasťami v metroch.

Boundless: Úvod do PostGIS: 27. Vyhľadávanie najbližších susedov

Boundless: Úvod do PostGIS: 29. Advanced Geometry Constructions


Pozri si video: Vypocet vzdialenosti na mape