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.
Jeder Versuch, A einzuschließen, wird wahrscheinlich D, E, F, G einschließen. Das Problem kann nicht gelöst werden, ohne einen genauen Pfad zu haben, der jeden Postleitzahlbereich definiert.
Suchen Sie eine solche Datenbank und erstellen Sie dann einen
SPATIAL
Index mit solchen beliebigen Polygonen.quelle
Du machst es falsch. Verwenden Sie nach Möglichkeit zunächst PostGIS - das führende RDMBS mit Spatial-Lösung.
Dann möchten Sie diese Schritte ausführen.
shp2pgsql
Indizieren Sie die importierte Geometrie.
Führen Sie eine POI-Abfrage (Point-of-Interest) für die Shapefiles aus. Der Punkt von Interesse in Ihrem Fall sind die Eingangskabel, dies wird so aussehen,
9. 1609,344 Meter = 1 Meile
MySQL
Mit MySQL haben Sie
Verwenden Sie
MBRIntersects
diese Option, um den räumlichen Index zu verwenden. Die Abfrage beenden sollte ungefähr so aussehenquelle
ST_DWithin
mitMBRIntersects
Schauen Sie sich diesen Datensatz von GreatData.com an (beachten Sie, dass dies kein Open Source, sondern ein kostenpflichtiger Dienst ist).
Sie verwenden die Bevölkerungsdichte anstelle des Zentrums der Postleitzahl.
Und wie man den räumlichen Datentyp von SQL Server verwendet, um schnell korrekte Ergebnisse zu erhalten.
Hoffe das hilft.
quelle