В данной статье мы рассмотрим процесс поиска ближайших объектов с помощью новых возможностей SQL в MapInfo Pro v2019 на примере ресторанов быстрого питания из набора данных Street Pro.
На изображении ниже фиолетовыми значками отмечены интересующие нас места, от которых будем вести поиск, а рестораны быстрого питания - характерными красными значками.
Мы хотим найти ближайшие рестораны к интересующим нас локациям, т.е. по сути «связать» каждое из интересующих нас мест с ресторанами быстрого питания. В этом конкретном случае мы используем расстояние 400 метров и прямую линию при измерении этого расстояния.
Процесс связывания наших локаций с ресторанами быстрого питания требует создания перекрестного соединения. При создании перекрестного соединения каждая запись в первой таблице соединяется с каждой записью во второй таблице. Если у вас много записей в одной или обеих этих таблицах, то в результате получится огромное количество записей, поэтому рекомендуется сразу ограничить количество строк, которые будут использоваться в перекрестном соединении.
В нашем случае мы ограничим количество ресторанов быстрого питания теми, которые находятся в буфере 1 км вокруг наших мест. Поэтому сначала выполняем один запрос, чтобы отфильтровать их, а затем используем полученный результат в перекрестном соединении с интересующими нас локациями.
Вот так будет выглядеть первый запрос, в котором мы отфильтруем рестораны быстрого питания, находящиеся в пределах 1 км от наших локаций:
Select * From NL_Business_Locations
Where Obj Within
(Select AggregateBuffer(obj, 10, 1, "km") From Potential_Stores)
And miCode = 10020300
Into temp_restaurants NoSelect
Несколько примечаний к этому запросу:
1. AggregateBuffer - новая функция, добавленная в MapInfo Pro v2019, создает буфер вокруг всех локаций, который затем используется для фильтрации всех объектов из таблицы по расстоянию не более 1 км.
2. Поскольку используемая нами таблица "NL_Business_Locations" содержит все виды точек интереса, а не только рестораны быстрого питания, мы отфильтруем их с помощью miCode 10020300.
3. Результатом этого запроса является выборка с именем temp_restaurants.
Теперь свяжем наши места с близлежащими ресторанами быстрого питания. Мы сделаем это с помощью перекрестного соединения, как упоминалось выше, и условия, которое мы используем в перекрестном соединении - возвращать только те записи, где расстояние между двумя записями меньше 400 метров.
Select s2.*, tr.Name, tr.SubCategory, ObjectLen(ConnectObjects(s2.obj, tr.Obj, 1), "m") As "DistanceAway_m", ConnectObjects(s2.obj, tr.Obj, 1) object
From Potential_Stores As "s2", temp_restaurants As "tr"
Where ObjectDistance(s2.obj, tr.Obj, "m") < 400
Into Selection
Несколько комментариев к этому запросу, поскольку он содержит новые функции, добавленные в MapInfo Pro v2019.
1. В части From указаны псевдонимы таблиц, что облегчает обращение к двум таблицам в запросе. Это также облегчает повторное использование этого скрипта, так как можно просто заменить имя таблицы в части From. Далее в скрипте также используются псевдонимы.
2. В условии Where указано возвращать только те записи, которые находятся ближе 400 метров друг к другу. В MapInfo Pro v2019 впервые появилась возможность объединить две таблицы с помощью перекрестного соединения и использовать функцию для определения условия фильтрации.
3. В части Select указаны все столбцы из таблицы "Potential Stores", используя обозначение: s2.*. Что означает возврат всех столбцов из таблицы с использованием псевдонима таблицы s2. Это тоже новинка MapInfo Pro v2019.
4. В разделе Select также указано, что нужно вернуть и использовать другой пространственный объект. Ключевое слово "object" указывает MapInfo Pro использовать пространственное выражение перед ключевым словом в качестве пространственного объекта для запроса. А выражение ConnectObjects (s2.obj, tr.Obj, 1) возвращает самую короткую линию между двумя объектами. Это новое ключевое слово в MapInfo Pro v2019.
В старых версиях MapInfo выполнить такой запрос было сложнее . Вам пришлось бы запускать два отдельных запроса, по одному за раз. В новой версии MapInfo Pro 2019 можно создать скрипт MapBasic с помощью окна SQL, содержащий два оператора Select, как здесь, или еще более продвинутые скрипты.
Ниже вы можете увидеть, как выглядит скрипт в SQL-окне MapInfo Pro v2019. Обратите внимание, что в области вывода окна SQL также указано добавить результат на карту с определенным (малиновым) цветом.
А на следующем изображении вы можете увидеть результат выполнения скрипта. Запрос добавляется на карту в виде малиновых линий, соединяющих наши места и рестораны быстрого питания поблизости. Если же использовать инструмент "Информация" на любом из наших мест, можно увидеть количество ближайших ресторанов быстрого питания, а также расстояние между местом и конкретным рестораном.
Новые возможности SQL в MapInfo Pro 2019 |
Построение буферных зон в MapInfo Pro |
Построение буферных зон в MapInfo Pro. Часть 2 |