Distanz- und Umkreissuche in Rollerbed-Datenbank

Dieses kleine Beispiel soll zeigen, wie einfach man die Distanz zwischen zwei Geokoordinaten errechnen kann:

SELECT ROUND( 1.609563462 * SQRT( X * X + Y * Y ) ) Distance
FROM
  (SELECT
    69.1 * (frankfurt.Latitude - langgoens.Latitude) AS X,
    53.0 * (frankfurt.Longitude - langgoens.Longitude) AS Y
  FROM
    (SELECT Latitude, Longitude FROM ZipCodes WHERE PostalCode = '60439') AS frankfurt,
    (SELECT Latitude, Longitude FROM ZipCodes WHERE PostalCode = '35428') AS langgoens
  ) AS distances

Das ist natürlich eine sehr statische Anfrage und das Ergebnis ist lediglich eine einzige Zahl: 37

Wenn dieses Beispiel noch etwas aufgebohrt wird, kann recht einfach eine Umkreissuche erfolgen:

SELECT *
FROM
  (SELECT CountryCode, PostalCode, ROUND( 1.609563462 * SQRT( X * X + Y * Y ) ) Distance
  FROM
    (SELECT
      69.1 * (other.Latitude - origin.Latitude) AS X,
      53.0 * (other.Longitude - origin.Longitude) AS Y,
      other.CountryCode,
      other.PostalCode
    FROM
      (SELECT Longitude, Latitude FROM ZipCodes WHERE CountryCode = 'DE' AND PostalCode = '60439') origin,
      ZipCodes other
    ) AS distances
  ) circumcicle
WHERE
  Distance <= 20
ORDER BY Distance, CountryCode, PostalCode

Dieses Beispiel liefert also alle bekannten Treffer in einem Umkreis von 20 km um die PLZ DE-60439 herum:

CountryCodePostalCodeDistance
DE604390 km
DE604312 km
DE604873 km
DE604883 km
DE603204 km
DE604374 km
DE603185 km
DE603225 km
DE603235 km
DE603255 km
DE604355 km
DE604865 km
DE603116 km
DE603136 km
DE603266 km
DE603276 km
DE603296 km
DE603896 km
DE604336 km
DE604896 km
DE605296 km
DE605496 km
DE614406 km
DE614496 km
DE657606 km
DE659316 km
DE659366 km
DE603167 km
DE603857 km
DE605967 km
DE613527 km
DE659337 km
DE605948 km
DE613488 km
DE658248 km
DE659348 km
DE603149 km
DE603889 km
DE605289 km
DE605999 km
DE611189 km
DE613509 km
DE659299 km
DE6059810 km
DE6306710 km
DE6584310 km
DE6147611 km
DE6038612 km
DE6306512 km
DE6306912 km
DE6581212 km
DE6119113 km
DE6307313 km
DE6326313 km
DE6583513 km
DE6118414 km
DE6138114 km
DE6146214 km
DE6146214 km
DE6307114 km
DE6307514 km
DE6545114 km
DE6113815 km
DE6146215 km
DE6119116 km
DE6127316 km
DE6146216 km
DE6577916 km
DE6579516 km
DE6583016 km
DE6119117 km
DE6119117 km
DE6330317 km
DE6113718 km
DE6120618 km
DE6126718 km
DE6316518 km
DE6347718 km
DE6315019 km
DE6322519 km
DE6454619 km
DE6571919 km
DE6312820 km
DE6317920 km
DE6581720 km