MySQL получает данные многоугольника

Я занимаюсь разработкой сайта, который хранит пространственные данные в базе данных MySQL, такие как здания, сады и т. д., в форме многоугольников (широты и долготы).

Я хочу знать, как получить данные многоугольника в mysql.

Я видел этот пример запроса для вставки данных многоугольника: http://amper.110mb.com/SPAT/mysql_initgeometry2.htm

Но теперь я хочу знать, как извлекать данные из таблицы на основе определенных ограничений, например:

"where latitude < 9.33 and longitude > 22.4" Также, как определить, находится ли точка внутри или вне многоугольника


person shasi kanth    schedule 24.02.2011    source источник


Ответы (1)


Вот страница с множеством примеров: http://howto-use-mysql-spatial-ext.blogspot.com/

Это один из примеров получения строк, точки которых пересекаются с указанным ограничивающим прямоугольником:

SET @bbox = 'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))'; 
SELECT name, AsText(location) FROM Points
    WHERE Intersects( location, GeomFromText(@bbox) );

MySQL документация говорит, что эти пространственные функции также работают с геометрией (похоже, что точка также является геометрией). Таким образом, вы можете проверить, пересекается ли геометрия в базе данных с геометрией, указанной в операторе select.

person kayahr    schedule 24.02.2011
comment
Итак, мне нужно вставить точку с широтой и долготой в таблицу точек и использовать ее для поиска внутри многоугольника? - person shasi kanth; 24.02.2011
comment
В этом примере местоположение относится к типу Point, да. Точка содержит положение по горизонтали и вертикали. См. Связанную страницу с примерами, чтобы увидеть, как создается и заполняется эта таблица в качестве примера. Но он также должен работать с типом Geometry. Я расширил ответ, чтобы охватить это. - person kayahr; 24.02.2011
comment
Я попробовал процесс, упомянутый на этой странице, но не получил строк для запроса выше. Это потому, что координаты точки (31,5 42,2) больше, чем размер многоугольника (10)? Но даже если я увеличу размеры многоугольника до 50, я не получаю никаких строк. - person shasi kanth; 24.02.2011
comment
Многоугольник не пересекается с 31.5,42.2, потому что он определяет прямоугольник от 0,0 до 10,10. Но он должен пересекать вашу точку с размером многоугольника 50. Вы использовали (0 0, 50 0, 50 50, 0 50, 0 0) для проверки? Может быть, вы можете привести полный пример с примерами содержимого таблицы, используемым оператором SQL, полученным результатом и тем, который вы ожидали? - person kayahr; 24.02.2011
comment
Да, kayahr, я использовал (0 0, 50 0, 50 50, 0 50, 0 0) для тестирования. Я обязательно объясню, что сделал. - person shasi kanth; 24.02.2011
comment
Сначала я создал таблицу точек: создайте таблицу точек (имя VARCHAR (20) PRIMARY KEY, местоположение Point NOT NULL, описание VARCHAR (200), SPATIAL INDEX (местоположение)) ENGINE = MYISAM. Затем я вставил строку: INSERT INTO Points (имя, местоположение) VALUES ('point1', GeomFromText ('POINT (31.5 42.2)')); Затем я написал такой запрос: SET @bbox = 'POLYGON ((0 0, 50 0, 50 50, 0 50, 0 0))'; ВЫБЕРИТЕ имя, AsText (местоположение) FROM Points WHERE Intersects (location, GeomFromText (@bbox)); Но у меня 0 строк. - person shasi kanth; 24.02.2011
comment
Я выполнил именно ваши утверждения, и он возвращает точку. Когда я изменяю многоугольник на размер 10x10, он не возвращает точку. Мне кажется, это правильно. Может быть, вы используете транзакции, и вставка не фиксируется до того, как вы выполните свой выбор? - person kayahr; 24.02.2011
comment
Я использую движок MyISAM при создании таблицы выше. Но я не могу понять, почему я не могу добиться должных результатов. - person shasi kanth; 24.02.2011
comment
В любом случае, я нашел здесь лучшую стратегию: stackoverflow.com/questions/5105035 / get-polygon-points-mysql :) - person shasi kanth; 25.02.2011