Olen kokeillut useita tapoja mitata kahden pisteen etäisyyttä Django-sovelluksessani ja verrata tuloksia luotettavaan mittaukseen. numerot ovat pois poissa. Oletan esimerkiksi, että todellinen etäisyys Dublinin ja Liverpoolin välillä on ~ 217 km, kuten Google Maps on ilmoittanut:

kirjoita kuvan kuvaus tähän

Käyttämällä geopy (tulisi olla erittäin tarkka ):

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

Djangon GEOS-sovellusliittymän käyttäminen (vähemmän tarkka lineaarinen laskenta):

>>> 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 

MUOKKAA: Paremman heijastuksen käyttäminen tämä alue (UTM 30N) tuottaa melkein saman tuloksen:

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

Molemmissa tapauksissa ”pois päältä” yli 100 km! Pienien etäisyyksien mittaaminen (< 1km) on yhtä epätarkka. Mitä teen väärin täällä !?

Kommentit

  • Django-esimerkillesi ei ' t EPSG: 3857 käyttää mittareita asteen sijasta ?
  • Mercatoria ei tulisi koskaan käyttää etäisyyden mittaamiseen, etenkään kaukana pohjoisessa.
  • Yritin muuttaa pisteet 32630: ksi (UTM-alue 30N) ja sain 328,3 km. Lähes mitään eroa tässä tapauksessa. ' ei ole mitään projisoinneista geopy -asiakirjoissa tai muissa vastauksissa, ja saamani Vincenty-etäisyyden tulisi olla tarkka mm-tasolla .
  • dublin.distance(liverpool)*100 < – Sen, että joudut kertomaan 100: lla 1000: n sijasta, pitäisi kertoa sinulle jotain epäilyttävää tapahtuu täällä.

Vastaa

Jos käännät koordinaatit, se ei toimi (geopy käyttää (leveysaste, pituusaste) WGS84 crs: ssä)

 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 ( muodokas , django ) käyttää suorakulmaista tasoa ja euklidista etäisyyttä. Kanssa pyproj (django käyttää (pituusaste, leveysaste))

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 

Mutta kuten Vince sanoo, että Mercator-projektiota ei tule koskaan käyttää etäisyyden mittaamiseen.

EPSG: 32630 (UTM-alue 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 

Ja kaikki tulokset (geopy ja django) ovat verrattavissa Googlen etäisyyteen tai Etäisyys Liverpoolista Dubliniin (218 km)

Kommentit

  • Lon, lat / lat, lon hämmennys iskee jälleen! Olin varma, että minulla oli se siellä.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *