Пакетные SQL-запросы и экспорт в MapBasic
-
- Активный участник
- Сообщения: 107
- Зарегистрирован: 17 янв 2010, 00:07
- Репутация: 5
- Откуда: Курск
Пакетные SQL-запросы и экспорт в MapBasic
Я по призванию никак не программист и не выучил ни одного языка, но тут стала задача автоматизировать несколько тысяч однотипных действий в 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-запрос, чтобы не нужно было пересекать три слоя полигонов в один?
Спасибо!
Есть три слоя 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-запрос, чтобы не нужно было пересекать три слоя полигонов в один?
Спасибо!
-
- Активный участник
- Сообщения: 161
- Зарегистрирован: 17 янв 2012, 18:51
- Репутация: 74
Re: Пакетные SQL-запросы и экспорт в MapBasic
1. Чтобы проверить какое-то условие, например отсутствие объектов в выборке, требуется соответствующий логический оператор (If … Then). Такие операторы использовать в окне MB нельзя. И вывод здесь один – нужно писать программу.
2. Не понял, что вы понимаете под операцией пересечения трех таблиц.
2. Не понял, что вы понимаете под операцией пересечения трех таблиц.
-
- Активный участник
- Сообщения: 107
- Зарегистрирован: 17 янв 2010, 00:07
- Репутация: 5
- Откуда: Курск
Re: Пакетные SQL-запросы и экспорт в MapBasic
Под пересечением таблиц понимаю следующее. Чтобы не делать запрос из 4 (1+3) таблиц, а сделать из двух (1+1), я получил полигоны как результат применения функции Intersects к трем таблицам Rel, RelS, RelA - атрибуты и объекты которых были объединены в одной таблице.
Насколько сложен будет код? Скажем, заработает код такого вида (условно)?:
Select_1
If (все ОК) Then Export 1
If (ошибка) Then Select 2
Вот собственно у меня задача и стоит написать код любой примитивный, но я этим никогда не занимался
Насколько сложен будет код? Скажем, заработает код такого вида (условно)?:
Select_1
If (все ОК) Then Export 1
If (ошибка) Then Select 2
Вот собственно у меня задача и стоит написать код любой примитивный, но я этим никогда не занимался

-
- Активный участник
- Сообщения: 161
- Зарегистрирован: 17 янв 2012, 18:51
- Репутация: 74
Re: Пакетные SQL-запросы и экспорт в MapBasic
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
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
-
- Завсегдатай
- Сообщения: 265
- Зарегистрирован: 22 окт 2012, 08:35
- Репутация: 50
- Откуда: Нижний Новгород
Re: Пакетные SQL-запросы и экспорт в MapBasic
Чтобы обойти ситуацию с пустой выборкой, используйте в выражении into вместо Selection другое имя. Например Select * From ... into tmptab. Тогда, если даже никакие объекты не выбраны, таблица tmptab все равно будет создана (пустая) и ошибки экспорта не будет. Если конечно пустые таблицы Вас не пугают.
Не совсем понятна задача, но очевидно, что проще написать несколько строк на MapBasic, чем вручную делать кучу запросов.
Если так, то причем здесь поля Upper_* в запросе?xar4enkkoff писал(а):Задача - поделить KBui на много-много слоев (в MID\MIF) в зависимости от того, куда попадает каждое здание на Rel, RelS, RelA.
Не совсем понятна задача, но очевидно, что проще написать несколько строк на MapBasic, чем вручную делать кучу запросов.
-
- Активный участник
- Сообщения: 107
- Зарегистрирован: 17 янв 2010, 00:07
- Репутация: 5
- Откуда: Курск
Re: Пакетные SQL-запросы и экспорт в MapBasic
Я расскажу детально, как все есть - будут понятно, почему 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 ботать времени совсем нет, я надеялся там элементарно все будет, но оказалось, что для меня многое не очевидно.
В связи с этим вопрос, есть ли дружелюбный софт для чайника (то есть без приложения программинга), в котором аналогичное можно сделать проще - рассортировать полигоны одного слоя по многим в зависимости от положения первого (в моем случае, зданий) на полигонах нескольких других слоев?
У меня была ЦМР - грид в формате 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 ботать времени совсем нет, я надеялся там элементарно все будет, но оказалось, что для меня многое не очевидно.
В связи с этим вопрос, есть ли дружелюбный софт для чайника (то есть без приложения программинга), в котором аналогичное можно сделать проще - рассортировать полигоны одного слоя по многим в зависимости от положения первого (в моем случае, зданий) на полигонах нескольких других слоев?
-
- Завсегдатай
- Сообщения: 265
- Зарегистрирован: 22 окт 2012, 08:35
- Репутация: 50
- Откуда: Нижний Новгород
Re: Пакетные SQL-запросы и экспорт в MapBasic
Тогда предлагаю такой вариант.
Опишу на словах. Как выполнить запросы, думаю сообразите.
Ну и на всякий случай, работайте с копиями таблиц.
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 придется нажать столько раз, сколько в тексте строк.
в. Зато не будет пустых таблиц
Опишу на словах. Как выполнить запросы, думаю сообразите.
Ну и на всякий случай, работайте с копиями таблиц.
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 придется нажать столько раз, сколько в тексте строк.
в. Зато не будет пустых таблиц

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