Bei einer Tabelle mit Orten mit Breiten- und Längengraden, welche dieser Orte sind am nächsten zu einem bestimmten Standort?Wie kann die Abfrageleistung verbessert werden, die haversine Formel berechnet?
Natürlich bedeutet das Finden von Entfernungen auf der Erdoberfläche die Verwendung von Großkreisdistanzen, die mit der Haversine-Formel, auch Spherical Cosine Law-Formel genannt, berechnet wurden.
Ich habe den folgenden Code:
SELECT zip, latitude, longitude, distance
FROM (
SELECT z.zip,
z.latitude, z.longitude,
p.radius,
p.distance_unit
* DEGREES(ACOS(COS(RADIANS(p.latpoint))
* COS(RADIANS(z.latitude))
* COS(RADIANS(p.longpoint - z.longitude))
+ SIN(RADIANS(p.latpoint))
* SIN(RADIANS(z.latitude)))) AS distance
FROM zip AS z
JOIN ( /* these are the query parameters */
SELECT 42.81 AS latpoint, -70.81 AS longpoint,
50.0 AS radius, 111.045 AS distance_unit
) AS p ON 1=1
WHERE z.latitude
BETWEEN p.latpoint - (p.radius/p.distance_unit)
AND p.latpoint + (p.radius/p.distance_unit)
AND z.longitude
BETWEEN p.longpoint - (p.radius/(p.distance_unit * COS(RADIANS(p.latpoint))))
AND p.longpoint + (p.radius/(p.distance_unit * COS(RADIANS(p.latpoint))))
) AS d
WHERE distance <= radius
Gibt es eine Möglichkeit, eine Leistung dieser Abfrage zu verbessern?
Ist es notwendig, PostGIS zu verwenden, um es zu verbessern, oder es ist nur ein Wrapper für meine hairsine Formel?
Welche DBMS verwenden Sie? Für eine effiziente Lösung in Postgres (mit PostGIS) siehe [hier] (http://stackoverflow.com/a/11479495/330315) –
Nebenbei bemerkt, wissen Sie, dass der 'where' Teil nicht innerhalb des Radius beschränkt ist , aber stattdessen zu einem Gitter 2r x 2r? – JohnHC
@a_horse_with_no_name Ich benutze PostgreSQL –