Страница 1 из 1

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

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

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

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

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

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

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

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

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

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

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

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

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

Добавлено: 17 мар 2015, 16:00
gamm
Опять студент домашнее задание сам делать не хочет ... hint: group by

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

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

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

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

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

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

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

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

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

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

Добавлено: 21 апр 2015, 11:54
LightMen
Спойлер
Изображение
Спойлер

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

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
Спрашивайте, если по коду что-то непонятно.