В каком многоугольнике указаны координаты?

Предположим, в базе данных MySQL у меня есть пары точек широты и долготы, которые создают десятки тысяч многоугольников на карте. Учитывая одну пару точек широты и долготы, как мне узнать, в каком многоугольнике (ах) она находится?

Кажется, это показывает, как определить, находится ли одна пара координат широты / долготы внутри многоугольника: MySQL: пространственный запрос, чтобы определить, находится ли точка широты / долготы в пределах заданной границы. Это здорово, если мне нужно только сравнить пару широта / долгота с одним многоугольником, но у меня много многоугольников.

Мне кажется, что я не могу сделать это на лету (я предполагаю, что запрос SQL будет настолько большим, что я превысил бы некоторый лимит, который есть в MySQL с точки зрения количества символов). Возможно, мне нужно перебрать каждый многоугольник и проверить его на пару lat / lng, а затем сохранить какой-то логический флаг, чтобы указать, находится ли пара внутри многоугольника. Мне это кажется очень неэффективным.

Предложения?


person StackOverflowNewbie    schedule 20.12.2015    source источник


Ответы (3)


Я предполагаю, что пары также имеют соответствующее значение, по которому их можно сгруппировать в многоугольники. Если вы дадите каждой группе две пары координат, которые образуют «прямоугольник» вокруг многоугольника, вы можете значительно ограничить поиск с помощью простого сравнения SQL.

Последнее вычисление того, включена ли точка в фактический многоугольник, кажется практически невозможным с помощью одного лишь SQL.

Это одно предложение.

person wiktus239    schedule 20.12.2015

Как быстро меняются ваши полигоны? Если они достаточно статичны, вы можете использовать реальное приложение ГИС, чтобы составить карту из десятков тысяч полигонов. Затем вы можете выполнить поиск идентификатора многоугольника по координатам и превратить его в проблему O (1). Иногда база данных - не единственный молоток в вашем арсенале инструментов.

person jwd630    schedule 21.12.2015

Вы можете сделать это с помощью одного запроса, но сначала вам нужно сохранить ваши многоугольники как правильную геометрию в mysql.

Вместо того, чтобы иметь длинный список точек, напишите сценарий, который будет брать ваши точки и строить полигоны.

CREATE TABLE mypolys (polyid INTEGER, g GEOMETRY);

Предполагая, что ваша таблица очков имеет какой-то полиид, вы можете перебирать их и собирать свои точки (используя код по вашему выбору). Где-то в вашем коде у вас будет sql вроде:

INSERT INTO mypolys (polyid, g)
VALUES(pid, PolygonFromText('POLYGON((
  x1 y1,
  x2 y2,
  x3 y3,
  x4 y4
  ))')
);

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

SELECT polyid FROM mypolys 
WHERE ST_CONTAINS(mypolys.g, Point(point_lon, point_lat))

Таким образом, используя преимущества пространственных индексов, которые вам даст тип «геометрия».

person user1269942    schedule 27.12.2015
comment
Если я помещу все точки широты / долготы в столбец ГЕОМЕТРИЯ, как вы предлагаете, есть ли способ преобразовать их обратно в значения широты / долготы? Они мне все еще понадобятся для полигонов на карте Google. - person StackOverflowNewbie; 28.12.2015
comment
Конечно! сохраните их, как сейчас, и используйте поле polyid для поддержания связи с многоугольником ... так что вы можете иметь прямой доступ к вашим точкам в одной таблице и доступ к пространственной геометрии в другой. вы также можете сохранить их как геометрию ТОЧКИ. Однако, если вы храните в двух местах, вам нужно будет разобраться с этим с помощью некоторого кода, даже если что-то обновляется. Другая возможность - сохранить их только как многоугольники, а при отображении визуализировать только как точки (если есть возможность для этого ... т.е. очистить заливку полигонов, без линий, только точки). - person user1269942; 28.12.2015