Клуб API Карт

Как можно найти все полигоны, в которые входит точка ?

nicholas.123
23 января 2011, 18:47

Вопрос был удален.

Ответ:

mysql> create table points ( name VARCHAR(20) PRIMARY KEY, location Point NOT NULL, description VARCHAR(200), SPATIAL INDEX(location) );

mysql> create table polygons ( name VARCHAR(20) PRIMARY KEY, location Point NOT NULL, description VARCHAR(200), SPATIAL INDEX(location) );

mysql> REPLACE INTO `points` (`name`, `location`) VALUES ('112', GeomFromText( 'POINT(37.63 55.76)'));

mysql> REPLACE INTO `polygons` (`name`, `location`) VALUES ('221', GeomFromText( 'POLYGON((37.61 55.97,37.21 55.54,38.04 55.58,37.61 55.97))'));

mysql> SELECT name, AsText(location) FROM polygons WHERE Intersects(GeomFromText('POINT(37.63 55.76)'), location );

5 комментариев
Подписаться на комментарии к посту
А если попробовать вот так

SET @point = 'POINT(37.63,55.76)';

SELECT name, AsText(location) FROM Polygons WHERE Intersects( GeomFromText(@point), location );
mysql> SET @point = 'POINT(37.63,55.76)';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT name, AsText(location) FROM Polygons WHERE Intersects( GeomFromText(@point), location );
Empty set (0.00 sec)
ваша "большая точность" есть просто умножение координаты на 1000.
Данная операция не прибавляет точности :) А вот значения после запятой великолепно справляются с данной задачей.

Вообще тот пример что написал newman полностью верен. Остальное зависит исключительно от ваших данных
SELECT Area(GeomFromText( 'POLYGON((37.12 55.68, 38.93 56.52, 36.26 54.55,37.12 55.68))'));

А пробел НИКОГДА не может быть разделителем в дроби.
Точка или запятая - в принципе могут, зависит от настроек локали( в разных странах по разному принято)
Но вот в mysql - точка.

У вас же получается что первая точка это x:37,y:12 и так далее

проверка


SELECT AsText(Envelope(GeomFromText( 'POLYGON((37.12 55.68, 38.93 56.52, 36.26 54.55,37.12 55.68))')));

Получите MBR - во первых можно посмотреть как сам mysql в текст переведет данные, во вторых увидеть координаты
например

AsText(Centroid(GeomFromText( 'POLYGON((37 12,55 68,37 93,56 52,38 26,55 55,37 12))')))                                                         POINT(46.3333333333333 51)


Спасибо.