2016-07-06 16 views
1

Ich habe eine Tabelle urbanpolygons die Spalte, die Polygon hält paths Ich habe einen Punkt, der von Polygonen umgeben ist und ich möchte die Polygone suchen und finden, welche näher an meinem Punkt ist.MySQL: Wie findet man das nächste Polygon von einem speziellen Punkt in MySQL-Versionen über 5.6.1?

Die grüne Box (Polygon) ist die, die man wählen sollte!

enter image description here

ich dies tun zu verwalten Punkt innerhalb eines Polygons oder nicht:

select * FROM urbanpolygons where ST_Contains(urbanpolygons.paths, GeomFromText('POINT(29.632262, 52.497868)')); 

DIESE FRAGE DUPLIZIEREN IST NICHT VONGet polygons close to a lat,long in MySQL oder MySQL Find Polygon Nearest to Point

Die ältere Frage, die ich erwähnt oben wurde vor 6 Jahren gefragt und viele geospatial Features wurden in MySQL seit dieser Zeit implementiert.

Es ist besser zu beantworten neue Funktionen von MySQL unter Berücksichtigung < 5.6.1 Angebote wie ST_Contains und ...

sqlfiddle bietet nicht MYSQL Version 5.6 über so habe ich beschlossen, hier ein litte Beispiel zu schreiben:

CREATE TABLE `urbanpolygons` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`name` varchar(45) NOT NULL, 
`paths` polygon NOT NULL, 
PRIMARY KEY (`id`), 
UNIQUE KEY `id_UNIQUE` (`id`) 
) 
INSERT INTO urbanpolygons (`id`, `name`, `paths`) VALUES ('1', 'area_1', ST_GeomFromText('POLYGON ((29.63383 52.492869,29.63411 52.493942,29.634446 52.494586,29.634837 52.495658,29.635397 52.497289,29.635676 52.49804,29.635919 52.498856,29.636217 52.499778,29.63674 52.501345,29.636889 52.501967,29.637131 52.502847,29.636851 52.503405,29.636497 52.503748,29.635285 52.50495,29.634483 52.505808,29.632804 52.503641,29.631592 52.502053,29.629652 52.499628,29.628496 52.498126,29.629204 52.497783,29.629652 52.497482,29.630361 52.496774,29.631126 52.495594,29.632002 52.494242,29.632655 52.493577,29.633308 52.492912,29.63383 52.492869))')); 
INSERT INTO urbanpolygons (`id`, `name`, `paths`) VALUES ('2', 'area_2', ST_GeomFromText('POLYGON ((29.633084 52.486968,29.632748 52.488384,29.629055 52.489929,29.625176 52.49023,29.625138 52.489328,29.624579 52.487869,29.624467 52.487311,29.627078 52.485809,29.628831 52.484179,29.630249 52.482634,29.631144 52.482419,29.633084 52.486968))')); 
INSERT INTO urbanpolygons (`id`, `name`, `paths`) VALUES ('3', 'area_3', ST_GeomFromText('POLYGON ((29.622564 52.488553,29.624504 52.494046,29.626892 52.498853,29.630622 52.505204,29.632711 52.507436,29.628981 52.509153,29.624653 52.501085,29.620773 52.505376,29.616744 52.49645,29.617192 52.490956,29.622564 52.488553))')); 

ich habe diesen Punkt:

GeomFromText('POINT(29.630528, 52.492461)') 

dieser Punkt aus dem dafür vorgesehenen Polygone ist, aber ich möchte das nächste Polygon erhalten zu diesem Punkt, der hier ist area_1!

+1

liefern Sie die Tabelle und die Daten in einer SQLFiddle. Und welche MySQL-Version. – Drew

+0

@Drew: sqlfiddle unterstützt nur mysql 5.6 und nicht darüber, die meisten ST_prefix-Funktionen in 5.6.1 implementiert! –

+1

ok ein Verweis auf eine Textdatei irgendwo mit Zeilen in einem Einfügeblock. Google Drive, etwas. Hauptsächlich sprechen wir über die gleichen Daten. – Drew

Antwort

0

schließlich konnte ich es auf diese Weise handhaben:

zum Glück ST_DISTANCE() Funktion bietet uns Abstand von einem beliebigen Geometrieobjekt zu anderen (ich der Abstand zwischen einem Punkt und Polygon vom Punkt zum nächstgelegenen Rande der Polygone berechnet glauben, getestet mit google Maps Entfernung und dem vorgesehenen Abstand von ST_DISTANCE)

select id 
    from (select st_distance(paths,POINT(29.630528, 52.492461))as polyDistance,id from urbanpolygons)as nearestPoly 
    where polyDistance = (select MIN(st_distance(paths,POINT(29.630528, 52.492461))) from urbanpolygons); 

, die ich kenne ein wenig komplex und ineffizient ist, und ich bin gespannt, jede bessere Lösung zu lernen!