Zkoušel jsem několik způsobů měření vzdálenosti mezi dvěma body v mé aplikaci Django a porovnání výsledků se spolehlivým měřením. čísla jsou cesta vypnuta. Například předpokládám, že skutečná vzdálenost mezi Dublinem a Liverpoolem je ~ 217 km, jak uvádí Mapy Google:

zde zadejte popis obrázku

Pomocí geopy (mělo by to být extrémně přesné ):

>>> from geopy.distance import distance >>> dublin = (-6.270447, 53.339791) >>> liverpool = (-2.991028, 53.402061) >>> distance(dublin, liverpool).km 362.70989455939394 

Použití GEOS API od Django (méně přesný lineární výpočet):

>>> from django.contrib.gis.geos import Point >>> dublin = Point(-6.270447, 53.339791, srid=3857) >>> liverpool = Point(-2.991028, 53.402061, srid=3857) >>> dublin.distance(liverpool)*100 328.00101418228877 

EDIT: Použití lepší projekce pro tato oblast (UTM 30N) přináší téměř stejný výsledek:

>>> dublin.transform(32630) >>> liverpool.transform(32630) >>> dublin.distance(liverpool)*100 328.32200116442266 

V obou případech jsem vypnutý o více než 100 km! Měření malých vzdáleností (< 1 km) je stejně nepřesný. Co tady dělám špatně !?

Komentáře

  • Pro váš příklad django není ' t EPSG: 3857 použít měřiče místo stupňů ?
  • Mercator by nikdy neměl být používán k měření vzdálenosti, zejména na dalekém severu.
  • Zkusil jsem transformaci bodů na 32630 (zóna UTM 30N) a dostal jsem 328,3 km. V tomto případě téměř žádný rozdíl. V dokumentech geopy nebo v jiných odpovědích není ' nic o projekci a vzdálenost Vincenty, kterou dostanu, by měla být přesná na úrovni mm .
  • dublin.distance(liverpool)*100 < – Skutečnost, že jste museli vynásobit 100 místo 1000, by vám měla něco říct zde se děje podezřelé.

Odpovědět

Pokud převrátíte souřadnice, nefunguje to (geopy používá (zeměpisná šířka a délka) v WGS84 crs)

 dublin = (53.33306,-6.24889) liverpool = ( 53.41058,-2.97794) print distance(dublin, liverpool).km 217.863019038 print(vincenty(dublin, liverpool).kilometers) 217.863019038 print(great_circle(dublin, liverpool).kilometers) 217.211596704 

GEOS ( shapely , django ) používá kartézskou rovinu a euklidovskou vzdálenost. S pyproj (použití django (zeměpisná délka, zeměpisná šířka))

from django.contrib.gis.geos import Point dublin = Point(-6.270447, 53.339791, srid=4326) # in degrees liverpool = Point(-2.991028, 53.402061, srid=4326) # in degrees dublin.distance(liverpool)*100 328.00101418228877 # units ? import pyproj # conversion from WGS84 to epsg:3857 p1 = pyproj.Proj(proj="latlong",datum="WGS84") p2 = pyproj.Proj(init="epsg:3857") a = pyproj.transform(p1,p2,-6.270447, 53.339791) b = pyproj.transform(p1,p2,-2.991028, 53.402061) dublin = Point(a) # in meters liverpool = Point(b) # in meters dublin.distance(liverpool)/1000 # Euclidean 365.2480859440489 #in km 

Ale jako Vince říká, že pro měření vzdálenosti by nikdy neměla být použita projekce Mercator.

S EPSG: 32630 (zóna UTM 30N):

p3 = pyproj.Proj(init="epsg:32630") a = pyproj.transform(p1,p3,-6.270447, 53.339791) b = pyproj.transform(p1,p3,-2.991028, 53.402061) dublin = Point(a) liverpool = Point(b) dublin.distance(liverpool)/1000 218.32514783088294 #in km 

A všechny výsledky (geopy a django) jsou srovnatelné se vzdáleností Google nebo Vzdálenost z Liverpoolu do Dublinu (218 km)

Komentáře

  • Zmatek lon, lat / lat, lon znovu udeří! Byl jsem si jist, že to mám právě tam.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *