Пакетные SQL-запросы и экспорт в MapBasic

MapInfo, MapBasic
Ответить
xar4enkkoff
Активный участник
Сообщения: 107
Зарегистрирован: 17 янв 2010, 00:07
Репутация: 5
Откуда: Курск

Пакетные SQL-запросы и экспорт в MapBasic

Сообщение xar4enkkoff » 06 мар 2014, 14:14

Я по призванию никак не программист и не выучил ни одного языка, но тут стала задача автоматизировать несколько тысяч однотипных действий в MapInfo.
Есть три слоя Rel - полигоны, RelS - полигоны, RelA - полигоны, каждый слой покрывает всю мою целевую площадь и KBui - полигоны здания, разбросанные то тут, то там.
Задача - поделить KBui на много-много слоев (в MID\MIF) в зависимости от того, куда попадает каждое здание на Rel, RelS, RelA.
В Rel - 21 тип полигонов, отличия которых заданы в атрибутах в цифровом виде. В RelS - тоже 21. В RelA - 12. Для упрощения (?), пользуя Intersects, пересек эти три слоя, создав один - HASK. Итого зданий может быть не более 5292 выборок.

Одиночный запрос с последующим экспортом в MapBasic выглядит у меня без излишеств (чему смог научиться, подсматривая в окошко MB в MapInfo):

Select * from KBui, HASK where KBui.Obj within HASK.Obj and HASK.Upper=78.75 and HASK.Upper_1=155 and HASK.Upper_12=1 into Selection
Export "Selection" Into "C:\Users\Sergey\Desktop\Orient\78.75_155_1.MIF" Type "MIF"

Одиночный запрос проходит хорошо, если под эти параметры запроса подходит хоть одно здание. Если нет - есс-но, выдает ошибку. Все бы ничего, но когда я составил серию запросов - процесс доходит до того запроса, которому не соответствуют объекты, выдает ошибку и прерывается.
Мой вопрос знатокам: 1) как сделать так, чтобы игнорировались запросы, которые не нашли свое Selection и процедура шла дальше? 2) как написать SQL-запрос, чтобы не нужно было пересекать три слоя полигонов в один?

Спасибо!

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

Re: Пакетные SQL-запросы и экспорт в MapBasic

Сообщение thegeo » 06 мар 2014, 14:53

1. Чтобы проверить какое-то условие, например отсутствие объектов в выборке, требуется соответствующий логический оператор (If … Then). Такие операторы использовать в окне MB нельзя. И вывод здесь один – нужно писать программу.
2. Не понял, что вы понимаете под операцией пересечения трех таблиц.

xar4enkkoff
Активный участник
Сообщения: 107
Зарегистрирован: 17 янв 2010, 00:07
Репутация: 5
Откуда: Курск

Re: Пакетные SQL-запросы и экспорт в MapBasic

Сообщение xar4enkkoff » 06 мар 2014, 15:26

Под пересечением таблиц понимаю следующее. Чтобы не делать запрос из 4 (1+3) таблиц, а сделать из двух (1+1), я получил полигоны как результат применения функции Intersects к трем таблицам Rel, RelS, RelA - атрибуты и объекты которых были объединены в одной таблице.

Насколько сложен будет код? Скажем, заработает код такого вида (условно)?:
Select_1
If (все ОК) Then Export 1
If (ошибка) Then Select 2

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

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

Re: Пакетные SQL-запросы и экспорт в MapBasic

Сообщение thegeo » 06 мар 2014, 17:34

1. Насколько понял вы из трех таблиц делаете одну и причем тут Intersects не ясно. Это можно сделать так
Insert Into tb1 Select * From tb2
Insert Into tb1 Select * From tb3

Все таблицы объединяются в tb1 (при условии если структуры таблиц одинаковые).
2. Вот как примерно может выглядеть анализ выборки
Select …
If SelectionInfo(SEL_INFO_NROWS)=0 then

Else

End if

3. Если вы настроены написать программу то будут полезны:
MapBasicReference (MapBasic СПРАВОЧНИК, http://www.mapbasic.ru)
MapBasicUserGuide (MapBasic РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ, http://www.mapbasic.ru)
Практические примеры (http://dfiles.ru/files/vp3m8zjmf)
Ну и сам mapbasic.exe

juffin_h
Завсегдатай
Сообщения: 265
Зарегистрирован: 22 окт 2012, 08:35
Репутация: 50
Откуда: Нижний Новгород

Re: Пакетные SQL-запросы и экспорт в MapBasic

Сообщение juffin_h » 06 мар 2014, 21:56

Чтобы обойти ситуацию с пустой выборкой, используйте в выражении into вместо Selection другое имя. Например Select * From ... into tmptab. Тогда, если даже никакие объекты не выбраны, таблица tmptab все равно будет создана (пустая) и ошибки экспорта не будет. Если конечно пустые таблицы Вас не пугают.
xar4enkkoff писал(а):Задача - поделить KBui на много-много слоев (в MID\MIF) в зависимости от того, куда попадает каждое здание на Rel, RelS, RelA.
Если так, то причем здесь поля Upper_* в запросе?
Не совсем понятна задача, но очевидно, что проще написать несколько строк на MapBasic, чем вручную делать кучу запросов.

xar4enkkoff
Активный участник
Сообщения: 107
Зарегистрирован: 17 янв 2010, 00:07
Репутация: 5
Откуда: Курск

Re: Пакетные SQL-запросы и экспорт в MapBasic

Сообщение xar4enkkoff » 12 мар 2014, 21:12

Я расскажу детально, как все есть - будут понятно, почему Upper.

У меня была ЦМР - грид в формате VerticalMapper. Из ЦМР я сделал три слоя полигонов.

Первый слой - абсолютные высоты. Таблица была названа Rel. Для каждого полигона в таблице атрибутов записывается в какой высотный интервал попадает участок. При построении этого слоя в ВертикалМэппер я указывал некий начальный уровень а-ля "110" и интервал типа "5", что значит, что MapInfo создает на основе грида полигоны с параметрами 1) Lower = 110; Upper = 115; 2) Lower = 115; Upper = 120; 3) Lower = 120; Upper = 125 .... n) Lower = 250; Upper = 255. Если на участке нет отметок выше 255абс - естественно, полигоны не создаются. Всего у меня в моем случае получился 21 тип полигонов, а самих полигонов само собой сильно больше.

Второй этап. Создал на основе ЦМР - грид углов наклона, крутизны. В ВертикалМэппер разбил его на полигоны. Указывал некий начальный уровень а-ля "о" и шаг "1" градус. В итоге получил полигоны территории по крутизне, в атрибутов каждого из них были свои Lower и Upper - 0 и 1, 1 и 2, 2 и 3 и так далее где то градусов до 15 крутизны. То есть получились полигоны 15 типов, но самих их - полигонов - было сильно больше. Это слой RelS.tab.

Третий этап. Создал на основе ЦМР - грид экспозиции земной поверхности участка. В ВертикалМэппер разбил его на полигоны. Указывал некий начальный уровень а-ля "о", первый шаг - 11,25 градусов по азимуту, а следующие - через 22,5; последний диапазон тоже был через 11,25 - от 347,25 до 360 градусов. То есть разбил всю территорию на поверхности с экспозицией по 16 румбам - С, ССВ, СВ, ..., ССЗ. По сути по 17 румбам, но сектор от 347,25 до 11,25 - суть одно и то же - северный румб. Естественно, в атрибутах полигонов были записаны Lower и Upper. Upper был 11,25; 37,75 и так далее. Назвал слой RelA.

Еще у меня был заветный слой - KBui - полигоны зданий, прямоугольнички. Центроиды каждого здания попадают на какой нибудь полигон в каждом слое Rel, RelS, RelA. SQL-запрос по трем Upper дает следующее - отсеиваются здания, попадающие в один высотный ярус (проведенные через 5 метров), на одной и то же крутизне (через 1 градус) и на поверхности, повернутой в одну и ту же сторону света (через 22,5 градуса на лимбе). Максимальное количество выборок - если на участках со всеми возможными сочетаниями трех параметров окажутся таки здания - около 6000.

Вот суть дела. MapBasic ботать времени совсем нет, я надеялся там элементарно все будет, но оказалось, что для меня многое не очевидно.
В связи с этим вопрос, есть ли дружелюбный софт для чайника (то есть без приложения программинга), в котором аналогичное можно сделать проще - рассортировать полигоны одного слоя по многим в зависимости от положения первого (в моем случае, зданий) на полигонах нескольких других слоев?

juffin_h
Завсегдатай
Сообщения: 265
Зарегистрирован: 22 окт 2012, 08:35
Репутация: 50
Откуда: Нижний Новгород

Re: Пакетные SQL-запросы и экспорт в MapBasic

Сообщение juffin_h » 13 мар 2014, 16:35

Тогда предлагаю такой вариант.
Опишу на словах. Как выполнить запросы, думаю сообразите.
Ну и на всякий случай, работайте с копиями таблиц.

1. К таблице KBui добавьте 4 поля: R, Rs, Ra, Q.
2. Выполнить 3 раза для KBui: таблица-обновить колонку R (Rs,Ra), значения извлечь из Rel(Rels,Rela), где объект из Rel(Rels,Rela) содержит объект из KBui.
Таким образом каждое здание содержит соответствующую информацию из Rel, RelS, Rela.
3. Обновляем поле Q значением "Select * from KBui Where R = " + R + " And Rs = " + Rs + " And Ra = " + Ra Into tmptab; Export tmptab into 'C:\Users\Sergey\Desktop\Orient\" + R + "_"+ Rs + "_" + Ra + '.MIF' Type 'MIF'"
4. Выполняем запрос Select Q from KBui с группировкой по полю Q и результат сохраняем как текст.
5. В лбом текстовом редакторе автоматом удаляем двойные кавычки, а одинарные заменяем на двойные.
6. Полученный текст загружаем в окно MapBasic.

Замечания:
а. Не знаю какого объема текст можно загрузить в окно MapBasic.
б. Клавишу Enter придется нажать столько раз, сколько в тексте строк.
в. Зато не будет пустых таблиц :)

Ответить

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

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

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