Пространственный запрос с использованием моего SQL

Я пишу из двух столбцов в формате varChar с именами «широта» и «долгота» в столбец в формате Point с именем «координата», используя приведенный ниже оператор.

"UPDATE table_name SET coordinate = PointFromText(CONCAT('POINT(',table_name.longitude,' ',table_name.lattitude,')'))"

Я пытаюсь выполнить пространственный запрос в столбце координат, используя следующий оператор.

SELECT id , coordinate FROM table_name WHERE MBRContains(GeomFromText('Polygon(-126.728566 49.226434, -123.652395 23.586457,-56.679738 23.908252,-53.076223 55.243002)'), coordinate)

Согласно этому инструменту, полигон в моем запросе охватывает всю территорию США. Я знаю, что есть точки в моей таблице, которые попадают в США, но я все еще не получаю никаких результатов (обратите внимание, что я получаю нулевой результат, а не ошибку). Любые идеи относительно того, что я делаю неправильно?

ОБНОВИТЬ. Ниже приведена обновленная попытка выполнить мой запрос в соответствии с приведенным ниже предложением.

SET @g1 = GeomFromText('Polygon((23.586457 -123.652395,23.908252 -56.679738,55.243002 -53.076223,55.243002 -53.076223,23.586457 -123.652395))');

SELECT id , coordinate FROM table_name WHERE MBRContains(@g1, coordinate)

person Ben Pearce    schedule 20.04.2013    source источник
comment
Вам не нужно замыкать полигон?   -  person david strachan    schedule 20.04.2013
comment
Я попытался снова добавить первую координату в и и все равно получил тот же результат.   -  person Ben Pearce    schedule 23.04.2013
comment
вы пытались установить простые данные для тестирования в table_name, например данные, используемые здесь: dev.mysql.com/doc/refman/4.1/en/relations-on-geometry-mbr.html. Проверить, что все работает как положено?   -  person user4035    schedule 23.04.2013


Ответы (2)


SELECT id , coordinate FROM table_name WHERE MBRContains(GeomFromText('Polygon((-126.728566 49.226434, -123.652395 23.586457,-56.679738 23.908252,-53.076223 55.243002, -126.728566 49.226434))'), coordinate)

Это должно работать. Проблема в том, что координаты многоугольника должны быть в двойных скобках. Он как-то связан с внутренними кольцами (полигоны). Плюс, как заметил Дэвид, нужно замкнуть полигон.

PS: я заметил, что вы используете долготу как X и широту как Y, когда это должно быть наоборот. X горизонтальны, а Y вертикальны.

person Gustek    schedule 23.04.2013
comment
долгота X и широта Y - person eldjon; 15.04.2015
comment
X — это координата по горизонтальной оси, поэтому вы рисуете вертикальную линию от точки до оси X, чтобы найти координату X, и наоборот, используя Y. - person eldjon; 15.04.2015

Поскольку вы имеете дело с координатами, вы пересекаете координаты широты и долготы.

Я создал карту Google, используя приведенные ниже координаты (обратив порядок ваших координат в Вопросе.

new google.maps.LatLng(49.226434,-126.728566),
new google.maps.LatLng(23.586457,-123.652395),
new google.maps.LatLng(23.908252,-56.679738),
new google.maps.LatLng(55.243002,-53.076223)

Многоугольник

Карты Google не требуют закрытия многоугольника.

Согласно документации, для MBR требуется многоугольник, который нужно закрыть.

mysql> SET @g1 = GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))');

EDIT В ответ на комментарий У вас правильный CHARSET?

Типовая пространственная таблица

CREATE TABLE IF NOT EXISTS `table_name` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `coordinate` geometry NOT NULL,
   PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

Убедитесь, что CHARSET=utf8;

person david strachan    schedule 23.04.2013
comment
Привет Дэвид, спасибо за ваше предложение. Я попытался реализовать (продемонстрировано в редактировании выше), но я все еще не получаю никаких результатов. Интересно, правильно ли я пишу в свой столбец координат. Вероятно, я должен упомянуть, что когда я смотрю на свою колонку координат в phpMyAdmin, она выглядит как набор закодированных символов (например, ������/=�[J@), то есть нечитаемых человеком. Не уверен, что это нормально. - person Ben Pearce; 24.04.2013