Sehen Sie, wenn lat / long, falls innerhalb eines Polygons mit mysql
Habe ich die erstellt Sie die Tabelle unten,
CREATE TABLE geom (g GEOMETRY);
haben und viele Zeilen eingefügt, Beispiel:
INSERT INTO geom (g)
VALUES(PolygonFromText('POLYGON((
9.190586853 45.464518970,
9.190602686 45.463993916,
9.191572471 45.464001929,
9.191613325 45.463884676,
9.192136130 45.463880767,
9.192111509 45.464095594,
9.192427961 45.464117804,
9.192417811 45.464112862,
9.192509035 45.464225851,
9.192493139 45.464371079,
9.192448471 45.464439002,
9.192387444 45.464477861,
9.192051402 45.464483037,
9.192012814 45.464643592,
9.191640825 45.464647090,
9.191622331 45.464506215,
9.190586853 45.464518970))')
);
Nun will ich Suche alle Daten und Rückkehr die Einträge, bei denen ein lat /long habe ich fällt mitn jedem der Polygone.
Wie geht das mit mysql? oder ist jemand bekannt, der irgendwelche links, die zeigen wird mich in die richtige Richtung?
InformationsquelleAutor der Frage | 2009-07-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
MySQL ab v5.1 unterstützt nur die Operationen auf den minimum bounding rectangles (MBR). Zwar gibt es eine " Enthält " - Funktion, die das tun würden, was Sie benötigen, ist es nicht vollständig umgesetzt, und fällt wieder auf die Verwendung MBRContains
Aus der jeweiligen Handbuch-Seite
Was Sie tun können, ist lassen Sie MySQL geben Sie eine Ungefähre Ergebnis, basierend auf MBR, und dann post-Prozess und eine genauere Prüfung. Alternativ dazu wechseln Sie zu PostGIS!
(Update Mai 2012 - Dank Mike Toews)
MySQL 5.6.1+ bietet Funktionen, die mit dem Objekt-Formen anstatt MBR
InformationsquelleAutor der Antwort Paul Dixon
Wenn Sie nicht ändern können dbs eine, die räumliche Operatoren implementiert korrekt, wie PostgreSQL mit der PostGIS-Erweiterung
http://postgis.refractions.net/
lösen Sie dieses problem mit einem zweiteiligen Ansatz.Ersten lassen MySQL geben Sie eine bounding-box pre-filtering Ergebnis basiert auf der bounding-box (das ist das, was Sie standardmäßig tut) mit Ihrem intersects-operator (
http://dev.mysql.com/doc/refman/5.1/en/functions-that-test-spatial-relationships-between-geometries.html#function_intersects
).If-Abfragen sind langsam, machen Sie sicher, dass Sie über einen index auf Ihre geometrie-Feld zuerst.
Dann Hydrat der ursprünglichen geometrie, die Sie in Ihre Abfrage in ein geometry-Objekt von GIS geometrie-Bibliothek GEOS (
http://trac.osgeo.org/geos/
) (C++ basiert, obwohl es auch bindings für andere Sprachen wie Python), Wohlgeformten (http://trac.gispython.org/lab/wiki/Shapely)
OGR ( oder der Java Topology Suite (JTS)http://www.vividsolutions.com/jts/jtshome.htm
).Test jeweils die Geometrien, die Sie wieder von Ihrem Abfrage-Ergebnis bei Verwendung der entsprechenden Operatoren wie innerhalb oder schneidet. Jede dieser Bibliotheken wird Ihnen ein Boolesches Ergebnis.
Persönlich würde ich schauen bei den Proben für OGR, da es eine große community, die bereit ist zu helfen.
Ach ja, und sorry für das setzen des links so... ich denke, da bin ich "neu" kann ich nur post einen link (?)
InformationsquelleAutor der Antwort rburhum
Die Funktion, die in dieser Beitrag auf den MySQL-Foren funktioniert perfekt für mich.
Es ist nicht sehr schnell und Sie müssen sicherstellen, dass die parameter 'mp' ist die gleiche Art wie die räumliche Spalte, die Sie verwenden (ich habe ogr2ogr zum importieren einer Ordnance Survey shape-Datei in MySQL, so war zu ändern, 'MULTIPOLYGON' , 'GEOMETRIE')
InformationsquelleAutor der Antwort Dan Herd
Habe ich umgeschrieben Funktion gegeben wurde, dass im vorherigen post von @danherd, so kann es die Arbeit mit echten Multipolygone, die bestehen aus mehr als einem polygon. Für diejenigen von Euch, die
immer noch mit der alten MySql-version sollte es helfen.
Hier ist es:
InformationsquelleAutor der Antwort user15