2014-07-08 17 views
6

Wykonuję teraz aplikację do nawigacji w mapach wewnętrznych, a ja próbuję wykonać to zbudować bazę danych punktu mapy w budynku.PostGis Distance Calculation

Wszystkie używane współrzędne są pobierane z Google Map (co oznacza, że ​​EPSG ma 3857). Co muszę zrobić, to znaleźć odległość w metrach, a także korzystać z D_Within w metrach

Kiedy próbuję wydobyć się odległość między 2 pkt:

SELECT ST_DISTANCE(
ST_GeomFromText('POINT(' || StartLon || ' ' || StartLat || ')',3857), 
ST_GeomFromText('POINT(' || EndLon || ' ' || EndLat || ')',3857)) 
FROM i3_building.floordata; 

przez pierwsze 2 rzędu z:

Start: 103.776047 1.292149; End: 103.77607 1.292212 (3 meters away) 
Start: 103.776070 1.292212; End: 103.77554 1.292406 (50 meters away) 

Wynik podany jest:

2.59422435413724e-005 
4.11096095831604e-005 

Mimo iż są one w rad, druga re Sult jest tylko dwa razy większy od pierwszego. Więc to sprawia, że ​​się mylę. Wtedy staram się go jako wyjścia liczników:

SELECT ST_DISTANCE(
    ST_GeographyFromText('POINT(' || StartLon || ' ' || StartLat || ')'), 
    ST_GeographyFromText('POINT(' || EndLon || ' ' || EndLat || ')')) 
FROM i3_building.floordata; 

Wynik podany w tych samych wierszach jest:

2.872546829 
4.572207435 

co nie jest, czego się spodziewałem, jak również. Nie jestem zaznajomiony z PostGis i SRID, więc to pytanie może wydawać się proste, ale proszę, pomóżcie mi, utknęło mi @@

Odpowiedz

11

Twój system odniesienia współrzędnych (CRS) to 4326, lat/lon. Jest to powszechne źródło nieporozumień z Google Maps: 3857 to CRS używany przez Google Maps dla swoich kafelków i prognozowany licznik oparty na sferycznej kuli ziemskiej. Źródła wektorowe dodawane do Map Google (dane KML, zrzuty GPS itp.) Mają zwykle wartość lat/lon, 4326, która jest mierzona w stopniach i konwertowana w locie.

Jeśli chcesz uzyskać odległość w metrach między dwoma punktami lat/lon, użyj ST_Distance_Sphere. Na przykład dla pierwszego zestawu punktów:

select st_distance_sphere(st_makepoint(103.776047, 1.292149),st_makepoint(103.77607, 1.292212)); 

który daje 7,457 metrów. Twój drugi zestaw punktów znajduje się 62,74 metrów od siebie, na podstawie tego samego zapytania.

Uwaga: istnieje również ST_Distance_Spheroid, który przyjmuje trzeci parametr, sferoidę pomiaru, tj. Przybliżenie kształtu ziemi. Będzie to potencjalnie bardziej dokładne, ale prawdopodobnie nieistotne na niewielkich odległościach.

ST_Distance podaje odległość we współrzędnych rzutowanych, co jest prawdopodobnie przyczyną dziwnych wyników zliczających wartości lat/lon.

+0

Dziękuję za odpowiedź. Spróbowałem też 4326, ale niewiele różni się od 3857. Na odległość pierwszego zestawu jest 3 metry, ponieważ znajduje się w moim biurze, więc znam go całkiem dobrze. Próbuję również obliczyć to stąd: http://boulter.com/gps/distance/ - ten sam wynik, 3 metry. –

+0

Co masz na myśli, mówiąc niewiele inaczej? Powiedziałbym, że 7,45 metra i 62,74 są zupełnie inne. Problemem jest jednak st_distance_sphere, ponieważ pobiera on dane wejściowe w lat/lon, gdzie st_distance zajmuje odległość w rzutowanych współrzędnych. 3857 i 4326 są radykalnie różne, są to odpowiednio metry i stopnie, ale musisz podłączyć je do odpowiednich funkcji, aby uzyskać właściwe odpowiedzi: D –

+0

Przepraszam, po prostu idź i spróbuj mierzyć, około 7 metrów jest całkiem poprawne.Dzięki za pomoc :) –

Powiązane problemy