Ich habe eine Tabelle mit Postleitzahlen, die die mittlere Lat-Länge für jede Postleitzahl enthält. Ich benutze es, um eine Liste von Postleitzahlen innerhalb eines bestimmten Meilenradius von einem beliebigen Punkt zu erhalten.
Mir ist gerade eingefallen, dass nur weil der Mittelpunkt eines Reißverschlusses nicht innerhalb eines bestimmten Radius liegt, dies nicht bedeutet, dass der Reißverschluss selbst nicht innerhalb des Radius liegt.
Ich habe meine hochentwickelten Kunstfähigkeiten genutzt, um den Punkt hier zu veranschaulichen:
Die grün gestreiften Blobs repräsentieren die Postleitzahlen A, B und C.
Die roten Flecken sind die geografischen Zentren für jede Postleitzahl
Der Fuchsia-Punkt ist der Zielort und ..
Der klumpige blaue Kreis ist einen Radius von 1 Meile vom Zielort entfernt
Wenn ich eine Abfrage für alle Postleitzahlen innerhalb eines Radius von 1 Meile vom rosa Fleck ausführe, werden nur die Postleitzahlen B und C zurückgegeben, da der Mittelpunkt für Postleitzahl A nicht innerhalb des Radius von einer Meile liegt, obwohl der rosa Fleck selbst liegt ist eindeutig in Postleitzahl A.
SELECT *,
p.distance_unit
* DEGREES(ACOS(COS(RADIANS(p.latpoint))
* COS(RADIANS(z.y))
* COS(RADIANS(p.longpoint) - RADIANS(z.x))
+ SIN(RADIANS(p.latpoint))
* SIN(RADIANS(z.y)))) AS dist
FROM standard_zip AS z
JOIN ( /* these are the query parameters */
SELECT $lat AS latpoint, $lng AS longpoint,
$miles AS radius, 69 AS distance_unit
) AS p ON 1=1
WHERE z.y
BETWEEN p.latpoint - (p.radius / p.distance_unit)
AND p.latpoint + (p.radius / p.distance_unit)
AND z.x
BETWEEN p.longpoint - (p.radius / (p.distance_unit * COS(RADIANS(p.latpoint))))
AND p.longpoint + (p.radius / (p.distance_unit * COS(RADIANS(p.latpoint))))
ORDER BY dist
Wie zum Teufel schreibe ich eine Abfrage, die Zip A in die Ergebnisse einbezieht?
Ich habe Zugriff auf Raum / Geometrie für jede Postleitzahl, die ich bei Bedarf zur Tabelle hinzufügen kann, aber ich habe keine Ahnung, wie ich sie für diesen Zweck in MySQL verwenden würde.
Bearbeiten : Ich habe einen Tag lang die Oracle- und MySQL-Dokumente für räumliche Daten gelesen und es geschafft , meine räumlichen Daten erfolgreich in MySQL zu konvertieren . Wie schreibe ich eine ähnliche Abfrage, bei der die Geometriespalte anstelle von lat und long verwendet wird? Ich verwende 2D-Daten. Die Geometrie besteht nur aus Polygonen und Multipolygonen.
Ich glaube, ich habe es irgendwie herausgefunden.
select
*
from
(
select
MIN(st_distance(geom, POINT(-82.765136, 28.0914015))) * 69 as miles,
zip
from
zip_spatial
group by
zip
order by
miles asc
) d
where
d.miles < 5
Ich werde das Kopfgeld vorerst offen lassen, falls jemand eine bessere, effizientere Lösung hat.