Страница 1 из 2
MapInfo (MapBasic): Как получить новые полигоны из наложений
Добавлено: 19 июн 2016, 18:20
Preev
Прошу помочь.
Имеются полигоны, которые имеют наложения. Как получить (добавить в таблицу) из наложений новые объекты, чтобы значения атрибутов также суммировались (на картинке param1, param2, param3) ?
Заранее Спасибо.

Re: MapInfo (MapBasic): Как получить новые полигоны из налож
Добавлено: 19 июн 2016, 18:55
trir
на SQL это решается гораздо проще...
Re: MapInfo (MapBasic): Как получить новые полигоны из налож
Добавлено: 19 июн 2016, 19:09
Preev
trir писал(а):на SQL это решается гораздо проще...
Настолько все усложняю? В MapInfo это сделать возможно запросом?
Все объекты в одном слое (таблице).
Re: MapInfo (MapBasic): Как получить новые полигоны из налож
Добавлено: 19 июн 2016, 19:12
trir
http://gis-lab.info/qa/ogr2ogr-examples ... B5_OGR_SQL
http://www.gdal.org/ogr_sql_sqlite.html
При манипуляции с данными SQL выигрывает перед языками программирования, потому что не надо думать как сделать, нужно лишь написать - что нужно сделать
В MapInfo есть свой диалект SQL'я, но он работает только в MapInfo. Поэтому проще импортировать данные в БД и использовать стандартный SQL, тем более что это будет просто быстрее
Re: MapInfo (MapBasic): Как получить новые полигоны из налож
Добавлено: 19 июн 2016, 19:25
Boris
2 [trir]
В ссылках не нашел способ создания новых полигонов на основе объектов из одной таблицы.
2 [Preev]
Сделать одним запросом нельзя по определению - MapInfo не умеет строить запросы на пересечение (любое хоть атрибутивное, хоть пространственное), на ОДНОЙ таблице. Так что как минимум придется сохранять копию таблицы.
Но для начала на рисунке расставьте буквы или цифры внутри тех полигонов, которые вы предполагаете получить в результате пересечения: полигоны дают результат пересечения для ВСЕХ полигонов или все же по ДВА?
Картинка (мне) совершенно не понятно. Видно, что есть полигоны в нахлест, но к чему относятся номера и атрибуты - не ясно.
Re: MapInfo (MapBasic): Как получить новые полигоны из налож
Добавлено: 19 июн 2016, 19:31
Preev
trir писал(а):При манипуляции с данными SQL выигрывает перед языками программирования
ну иногда приходится в запросах циклы использовать - тогда без небольшого кода не обойтись.
Вернусь к своему вопросу: мне это надо решать средствами MapInfo (или MapBasic).
Re: MapInfo (MapBasic): Как получить новые полигоны из налож
Добавлено: 19 июн 2016, 19:51
Preev
Boris писал(а):2 [trir]
В ссылках не нашел способ создания новых полигонов на основе объектов из одной таблицы.
2 [Preev]
Сделать одним запросом нельзя по определению - MapInfo не умеет строить запросы на пересечение (любое хоть атрибутивное, хоть пространственное), на ОДНОЙ таблице. Так что как минимум придется сохранять копию таблицы.
Но для начала на рисунке расставьте буквы или цифры внутри тех полигонов, которые вы предполагаете получить в результате пересечения: полигоны дают результат пересечения для ВСЕХ полигонов или все же по ДВА?
Картинка (мне) совершенно не понятно. Видно, что есть полигоны в нахлест, но к чему относятся номера и атрибуты - не ясно.

4-й полигон - геометрически наложение 1 и 2 за вычетом 5-го, атрибут param1(4)=param1(1)+param1(2)
5-й полигон - геометрически наложение 1 и 2 и 3-го, атрибут param1(5)=param1(1)+param1(2)+param1(3)
Не могу найти как это вообще можно сделать.
Смог из разных слоев все свести в один (Mapbasic) - подумал, что так проще будет, но пока не знаю куда дальше двигаться.
Как я понял, сводить все слои в один смысла не имело?
Re: MapInfo (MapBasic): Как получить новые полигоны из налож
Добавлено: 19 июн 2016, 20:13
trir
выложи wkt полигонов
Re: MapInfo (MapBasic): Как получить новые полигоны из налож
Добавлено: 19 июн 2016, 20:28
Preev
trir писал(а):выложи wkt полигонов
На картинке - условная схема.
В реальном проекте - несколько десятков слоев с несколькими десятками полигонов в каждом.
Я пытаюсь определиться с подходом, а не получить готовое решение.
Сначала на трех условных полигонах - а дальше уже будет гораздо проще

Re: MapInfo (MapBasic): Как получить новые полигоны из налож
Добавлено: 19 июн 2016, 20:48
thegeo
Как это можно выполнить средствами MapInfo (в моем понимании задачи).
Выделяем объекты 1, 2, 3. Выполняем Правка/Копировать (Вставить). Объединяем полученную копию в один объект (Объекты/Объединить). При объединении указать суммирование значений в соответствующих полях (Objects Combine Data id2=sum(id2),at1=sum(at1),at2=sum(at2),at3=sum(at3)). Выделяем этот объект и делаем его редактируемым (Объекты/Выбрать изменяемый объект). Выделяем объекты 1, 2, 3 и выполняем Объекты/Разрезать. Для полей указываем "пропорционально площади" (Objects Split Into Target Data id2=id2,at1=proportion(at1),at2=proportion(at2),at3=proportion(at3)).
При желании все это можно оформить в виде отдельной процедуры.
Re: MapInfo (MapBasic): Как получить новые полигоны из налож
Добавлено: 19 июн 2016, 21:10
trir
сначала STIntersection, а потом STDifference
тестовый набор данных не помешал бы...
Re: MapInfo (MapBasic): Как получить новые полигоны из налож
Добавлено: 19 июн 2016, 21:30
Preev
thegeo писал(а):Как это можно выполнить средствами MapInfo (в моем понимании задачи).
Выделяем объекты 1, 2, 3. Выполняем Правка/Копировать (Вставить). Объединяем полученную копию в один объект (Объекты/Объединить). При объединении указать суммирование значений в соответствующих полях (Objects Combine Data id2=sum(id2),at1=sum(at1),at2=sum(at2),at3=sum(at3)). Выделяем этот объект и делаем его редактируемым (Объекты/Выбрать изменяемый объект). Выделяем объекты 1, 2, 3 и выполняем Объекты/Разрезать. Для полей указываем "пропорционально площади" (Objects Split Into Target Data id2=id2,at1=proportion(at1),at2=proportion(at2),at3=proportion(at3)).
При желании все это можно оформить в виде отдельной процедуры.
Спасибо, но, к сожалению, это не работает. "Пропорционально площади" здесь совсем не годится. Если два полигона накладываются - то param наложения должен быть суммой param,ов соответствующих полигонов. Если три - то трех.
Re: MapInfo (MapBasic): Как получить новые полигоны из налож
Добавлено: 19 июн 2016, 21:45
trir
самый простой способ объяснить задачу - написать SQL-запрос ;=)
Re: MapInfo (MapBasic): Как получить новые полигоны из налож
Добавлено: 19 июн 2016, 21:48
Preev
trir писал(а):самый простой способ объяснить задачу - написать SQL-запрос ;=)
Но, к сожалению, синтаксис будет не MapInfoвский.
Re: MapInfo (MapBasic): Как получить новые полигоны из налож
Добавлено: 19 июн 2016, 21:49
trir
забудьте уже про MapInfo, это прошлый век