SQL-запрос. Найти полигоны через которые проходит полилиния

MapInfo, MapBasic
Ответить
Browning Zed
Новоприбывший
Сообщения: 4
Зарегистрирован: 16 мар 2015, 13:14
Репутация: 0

SQL-запрос. Найти полигоны через которые проходит полилиния

Сообщение Browning Zed » 16 мар 2015, 13:32

Доброго всем! Ситуация: существует карта поделенная полигонами на несколько сотен кварталов. На карте полилиниями оцифрована дорожная сеть. Требуется определить через какие кварталы проходит каждая из дорог, и как к этому подойти с наименьшими затратами. То есть либо по каждой дороге можно создать путем запроса просто выборку кварталов, либо возможно существует какой-то более продвинутый способ (или утилита), которая прописывала бы в определенное поле таблицы дорог, номера кварталов, взятые также из соответствующих полей через определенный разделитель (запятую, пробел).

Sibit
Активный участник
Сообщения: 216
Зарегистрирован: 21 окт 2009, 13:29
Репутация: 28
Откуда: Новосибирск

Re: SQL-запрос. Найти полигоны через которые проходит полили

Сообщение Sibit » 17 мар 2015, 09:04

Нужно для каждой дороги делать отдельный запрос. Потом обновлять колонку. У вас отношение многие ко многим, так что одним обновлением не получится. Можно написать простой скрипт, который это сделает автоматически.

Browning Zed
Новоприбывший
Сообщения: 4
Зарегистрирован: 16 мар 2015, 13:14
Репутация: 0

Re: SQL-запрос. Найти полигоны через которые проходит полили

Сообщение Browning Zed » 17 мар 2015, 13:16

Sibit писал(а):Нужно для каждой дороги делать отдельный запрос. Потом обновлять колонку.
Как будет выглядеть подобный запрос?
Sibit писал(а):У вас отношение многие ко многим, так что одним обновлением не получится. Можно написать простой скрипт, который это сделает автоматически.
Скрипт на MapBasic имеется ввиду? Я от него весьма далек. Хотя бы для начала с SQL разобраться.

Sibit
Активный участник
Сообщения: 216
Зарегистрирован: 21 окт 2009, 13:29
Репутация: 28
Откуда: Новосибирск

Re: SQL-запрос. Найти полигоны через которые проходит полили

Сообщение Sibit » 17 мар 2015, 13:37

Browning Zed писал(а): Как будет выглядеть подобный запрос?
Примерно так:

Код: Выделить всё

Select * from Таблица_с_кварталами where Obj contains part any(Select Obj from Таблица_с_дорогой ) into Selection
Где Таблица_с_дорогой - выборка с одной дорогой.
Browning Zed писал(а):Скрипт на MapBasic имеется ввиду? Я от него весьма далек. Хотя бы для начала с SQL разобраться.
Есть хорошая новость, от SQL там только название. Она же и плохая - любую более-менее сложную выборку делать только через скрипт(да еще и с сохранением временных таблиц на диск)

Browning Zed
Новоприбывший
Сообщения: 4
Зарегистрирован: 16 мар 2015, 13:14
Репутация: 0

Re: SQL-запрос. Найти полигоны через которые проходит полили

Сообщение Browning Zed » 17 мар 2015, 15:44

Спасибо за отзыв. Но пока до конца не понимаю как выполнить данный запрос. Из исходных данных:
Таблица с кварталами - Кварталы
Таблица с дорогами - Дороги
Поле содержащее номер квартала в таблице Кварталы - КН
Изображение
При вводе информации указанной в скриншоте, получаю сообщение: Не определена переменная или поле Select.

gamm
Гуру
Сообщения: 4047
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1050
Ваше звание: программист
Откуда: Казань

Re: SQL-запрос. Найти полигоны через которые проходит полили

Сообщение gamm » 17 мар 2015, 16:00

Опять студент домашнее задание сам делать не хочет ... hint: group by

[ Сообщение с мобильного устройства ]

Browning Zed
Новоприбывший
Сообщения: 4
Зарегистрирован: 16 мар 2015, 13:14
Репутация: 0

Re: SQL-запрос. Найти полигоны через которые проходит полили

Сообщение Browning Zed » 17 мар 2015, 16:23

gamm писал(а):Опять студент домашнее задание сам делать не хочет ... hint: group by
Да далеко не студент уже. Просто по специализации не являюсь программером, сам - кадастровик, и вот сложившаяся ситуация требует расставить точки над i. И если технологии XML, мне еще как-то понятны (XPath, XQuery), то SQL для меня лес темный. А Вы помимо сарказма, что-то дельное можете предложить?

Sibit
Активный участник
Сообщения: 216
Зарегистрирован: 21 окт 2009, 13:29
Репутация: 28
Откуда: Новосибирск

Re: SQL-запрос. Найти полигоны через которые проходит полили

Сообщение Sibit » 18 мар 2015, 07:39

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

ЗЫ На картинке, что вы привели, форма для конструирования запросов. Соответственно, в поле условие нужно вводить то что в запросе идет после слова where. Можете открыть консоль MapBasic (кнопка с гаечным ключом) и посмотреть, как данная форма преобразует введенные данные в запрос.

thegeo
Активный участник
Сообщения: 160
Зарегистрирован: 17 янв 2012, 18:51
Репутация: 74

Re: SQL-запрос. Найти полигоны через которые проходит полили

Сообщение thegeo » 18 мар 2015, 22:06

Результат можно получить с помощью запроса (см. картинку) или ввести в окно MapBasic соответствующий код:
Select * from Дороги, Кварталы where Дороги.obj Intersects Кварталы.obj into Selection
Browse * From Selection

Возможно, это не совсем то, что вы хотели бы, но получить для каждой дороги список кварталов в виде строки так просто не получится. Потребуется написать, м.б. и не сложный, но все же код.
Вложения
miHG162.png
miHG162.png (49 КБ) 8798 просмотров

LightMen
Интересующийся
Сообщения: 32
Зарегистрирован: 09 окт 2014, 10:59
Репутация: 5

Re: SQL-запрос. Найти полигоны через которые проходит полили

Сообщение LightMen » 21 апр 2015, 11:54

Спойлер
Изображение
Спойлер

Код: Выделить всё

include "mapbasic.def"

Dim TableNameLine as String    'имя таблицы с полилиниями
Dim TableNamePoly as String    'имя таблицы с полигонами
Dim AliasIntersection as Alias 'поле для записи пересекающихся полигонов с линией в таблице TableNameLine

Declare sub main()

sub main()
  
 TableNameLine ="Line"
 TableNamePoly= "Poly"
 AliasIntersection="IntersectsPoly"
 
 update TableNameLine set AliasIntersection=""
 
 Dim i,j as integer  
 For i=1 to TableInfo(TableNameLine,TAB_INFO_NROWS)
 
 	
 	select * from TableNamePoly where obj intersects (select obj from TableNameLine where rowid=i)  'objectA  Intersects  objectB	если объекты имеют хотя бы одну общую точку.
 	
 	if selectioninfo(3)<>0 then
 	
 	Dim tempStr as string
 	tempStr=""
 	
 	  do while not eot(selection) 	  
 	    tempStr=tempStr+selection.id+","
 	    fetch next from selection
 	  loop
 	   	   	  
 	  update TableNameLine set AliasIntersection=left$(tempstr,len(tempstr)-1) where rowid=i
 	
 	End if
 Next
	

end sub
Спрашивайте, если по коду что-то непонятно.

Ответить

Вернуться в «MapInfo»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 4 гостя