Po pierwsze, jeśli używasz szerokości i długości geograficznej, musisz użyć 4326.
UPDATE season SET geom = ST_PointFromText ('POINT(' || longitude || ' ' || latitude || ')' , 4326 ) ;
Następnie tworzysz indeks na polu geom
CREATE INDEX [indexname] ON [tablename] USING GIST ( [geometryfield] );
Wtedy dostaniesz sąsiadów kNN:
SELECT *,ST_Distance(geom,'SRID=4326;POINT(newLon newLat)'::geometry)
FROM yourDbTable
ORDER BY
yourDbTable.geom <->'SRID=4326;POINT(newLon newLat)'::geometry
LIMIT 10;
To zapytanie będzie korzystać z funkcji kNN indeksu gist (http://workshops. boundlessgeo.com/postgis-intro/knn.html ).
Jednak zwrócona odległość będzie wyrażona w stopniach, a nie metrach (projekcja 4326 używa stopni).
Aby to naprawić:
SELECT *,ST_Distance(geography(geom),ST_GeographyFromText('POINT(newLon newLat)')
FROM yourDbTable
ORDER BY
yourDbTable.geom <->'SRID=4326;POINT(newLon newLat)'::geometry
LIMIT 10;
Podczas obliczania ST_distance użyj typu geography. Odległość jest zawsze w metrach:
http://workshops.boundlessgeo.com/postgis-intro/geography.html
Cała ta funkcjonalność będzie prawdopodobnie wymagała najnowszej wersji Postgis (2.0+). Nie jestem jednak pewien.
Sprawdź to w celach informacyjnych https:// gis.stackexchange.com/questions/91765/improve-speed-of-postgis-nearest-neighbor-query/