Нахождение одного ЗУ в нескольких территориальных зонах

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

Re: Нахождение одного ЗУ в нескольких территориальных зонах

Сообщение gamm » 02 окт 2014, 16:50

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

Аватара пользователя
ginpetr
Завсегдатай
Сообщения: 385
Зарегистрирован: 21 июн 2011, 12:07
Репутация: 140
Откуда: Орск
Контактная информация:

Re: Нахождение одного ЗУ в нескольких территориальных зонах

Сообщение ginpetr » 03 окт 2014, 06:07

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

Аватара пользователя
ginpetr
Завсегдатай
Сообщения: 385
Зарегистрирован: 21 июн 2011, 12:07
Репутация: 140
Откуда: Орск
Контактная информация:

Re: Нахождение одного ЗУ в нескольких территориальных зонах

Сообщение ginpetr » 03 окт 2014, 07:03

Уже знаю как исправить.
Нужна ещё одна временная колонка со значением "Proportion Sum" Area(obj,"hectare") и условием объединения по пересечению. При создании тематической карты нужно задать такое условие:

Scont<>pavgSint or (psumSint<>Sobj and psumSint>0),

где Scont - временная колонка "значение" Area(obj,"hectare") с объединением типа "содержит"(contains)
pavgSint - временная колонка "Proportion Avg" Area(obj,"hectare") с объединением типа "пересекает"(intersects)
psumSint - временная колонка "Proportion Sum" Area(obj,"hectare") с объединением типа "пересекает"(intersects)
Sobj - площадь участка Area(obj,"hectare")

пока испытания успешные.

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

Re: Нахождение одного ЗУ в нескольких территориальных зонах

Сообщение gamm » 03 окт 2014, 12:53

ginpetr писал(а):Уже знаю как исправить.
а что мешает использовать group by для объединения по пересечению, и считать число участков, для который площадь пересечения > 0 - для "правильный участков это число равно 1. Тогда временные колонки не нужны.

Аватара пользователя
ginpetr
Завсегдатай
Сообщения: 385
Зарегистрирован: 21 июн 2011, 12:07
Репутация: 140
Откуда: Орск
Контактная информация:

Re: Нахождение одного ЗУ в нескольких территориальных зонах

Сообщение ginpetr » 03 окт 2014, 20:46

gamm писал(а):
ginpetr писал(а):Уже знаю как исправить.
а что мешает использовать group by для объединения по пересечению, и считать число участков, для который площадь пересечения > 0 - для "правильный участков это число равно 1. Тогда временные колонки не нужны.
Не понимаю, как это реализовать. Можно хоть чуть-чуть подробнее?
Мой последний способ логически верен на 100% (пока я в этом уверен), но на практике почему- то psumSint<>Sobj ( расшифровка выше) выполняется для участка, где эти два значения заведомо равны. Причина или в округлении одного из них, или в разных расчётах ( сфера/плоскость). Доберусь до мапинфо - выясню.
Запрос thegeo работает и уже может использоваться, но для моей работы нужен результат "в реальном времени".

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

Re: Нахождение одного ЗУ в нескольких территориальных зонах

Сообщение gamm » 04 окт 2014, 15:10

ginpetr писал(а):Не понимаю, как это реализовать. Можно хоть чуть-чуть подробнее?
это обычный SQL, который в Мапинфо реализован через поля формы (там есть поля типа Group by Column), группировка по ID участка, подсчет count(*). Как-то так, если ничего за последние 10 лет не поменяли ...

Boris
Гуру
Сообщения: 4231
Зарегистрирован: 10 апр 2006, 22:34
Репутация: -344969098
Откуда: Париж

Re: Нахождение одного ЗУ в нескольких территориальных зонах

Сообщение Boris » 04 окт 2014, 22:54

Единственно, я бы для краткости и удобства предложил использовать ф-ию ProportionOverlap( ), про которую часто забывают:
ProportionOverlap( ) function
Purpose
Returns a number that indicates what percentage of one object is covered by another object. You can call this function from the MapBasic Window in MapInfo Professional.

Syntax
ProportionOverlap( object1, object2 )
object1 is the bottom object, and it is a closed object.

object2 is the top object, and it is a closed object.

Return Value
A float value equal to AreaOverlap( object1, object2 ) / Area( object1 ).

Boris
Гуру
Сообщения: 4231
Зарегистрирован: 10 апр 2006, 22:34
Репутация: -344969098
Откуда: Париж

Re: Нахождение одного ЗУ в нескольких территориальных зонах

Сообщение Boris » 04 окт 2014, 22:58

gamm писал(а):
ginpetr писал(а):Уже знаю как исправить.
а что мешает использовать group by для объединения по пересечению, и считать число участков, для который площадь пересечения > 0 - для "правильный участков это число равно 1. Тогда временные колонки не нужны.
По моему этот способ не сработает для участка, который имеет пересечение, но только с одной границей (уч.24) в примере. У него то же получается значение 1. И, к стати, это условие возможно реализовать и через добавление временной колонки. Правда, у меня оно на примере срабатывает во множестве мест. Но как сказано выше, это может быть следствием неточности (нетопологичности) разных таблиц в Mapinfo.

Boris
Гуру
Сообщения: 4231
Зарегистрирован: 10 апр 2006, 22:34
Репутация: -344969098
Откуда: Париж

Re: Нахождение одного ЗУ в нескольких территориальных зонах

Сообщение Boris » 04 окт 2014, 23:12

Я предлагаю как то сузить задачу, если ее решение еще нужно, а то она разрослась в разные стороны. И запросы и тематика, и группировка. Давайте вернемся к постановке задачи, а то решать задачу о стольких переменных не хватает глубины перебора.
Я понимаю задачу так:
Надо составить такое тематическое выражение, что бы видеть "участки", пересекающие "зоны". Это связано с тем, что тематика обновляется автоматически после исправления участка, а запрос - нет.
Проблемы с составлением запроса - нет. Эта часть задачи уже решена.
Дополнительное условие: желательно отклонять участки, которые номинально пересекают границу только за счет незначительной (+-2 см) неточности координат границ.
PS
Я раньше как то не вникал в проблему обновления запросов, но поскольку в механизме Mapinfo, события для обновления окна и изменения кол-ва выделенных элементов присутствуют, может кто то встречал и приложение на MapBasic'е, которое обновляет запросы в окне после обновления окна?
По опыту в Geomedia, знаю, что при сложном или вложенном запросе, такое может "убить" всякую осмысленную работу, за счет постоянного пересчета окна и запросов. ;(

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

Re: Нахождение одного ЗУ в нескольких территориальных зонах

Сообщение thegeo » 05 окт 2014, 17:10

Получить нужный результат с использованием тематической карты у меня не получилось, поэтому предлагаю небольшую программку, в которой вынес на кнопку указанный выше запрос с некоторыми дополнениями (MB v.11.5). Здесь же сам код, если у кого-то возникнет желание поэкспериментировать.
В принципе можно было бы использовать процедуру WinChangedHandler. Не пробовал.
Вложения
miHG028.png
miHG028.png (29.62 КБ) 9996 просмотров
findIntersections.zip
(3.17 КБ) 318 скачиваний

Аватара пользователя
ginpetr
Завсегдатай
Сообщения: 385
Зарегистрирован: 21 июн 2011, 12:07
Репутация: 140
Откуда: Орск
Контактная информация:

Re: Нахождение одного ЗУ в нескольких территориальных зонах

Сообщение ginpetr » 06 окт 2014, 07:24

В моей последней формуле

Scont<>pavgSint or (psumSint<>Sobj and psumSint>0)

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

Scont<>pavgSint or round(psumSint,0.01)<>round(Sobj,0.01) and psumSint>0

Так всё работает.
ИТОГО:
можно в окне Mapbasic выполнить набор команд, по добавлению новых динамических колонок

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

Add Column "участки" (S Float)From Зоны Set To Area(obj, "sq m") Where contains Dynamic
Add Column "участки" (psS Float)From Зоны Set To proportion sum(Area(obj, "sq m")) Where intersects Dynamic
Add Column "участки" (paS Float)From Зоны Set To proportion avg(Area(obj, "sq m")) Where intersects Dynamic
и построить тематику отдельных значений по выражению
S<>paS or Round(psS, 0.01)<>Round(Area(Object, "sq m"), 0.01) and psS>0
Т(True) - для участков пересекающих зоны

Аватара пользователя
ginpetr
Завсегдатай
Сообщения: 385
Зарегистрирован: 21 июн 2011, 12:07
Репутация: 140
Откуда: Орск
Контактная информация:

Re: Нахождение одного ЗУ в нескольких территориальных зонах

Сообщение ginpetr » 06 окт 2014, 08:02

Раньше было много задумок, которые логично было посадить на WinChangedHandler. Но испытания показали, что её использование часто вызывает "вылет" программы с потерей всего несохранённого.

Аватара пользователя
ginpetr
Завсегдатай
Сообщения: 385
Зарегистрирован: 21 июн 2011, 12:07
Репутация: 140
Откуда: Орск
Контактная информация:

Re: Нахождение одного ЗУ в нескольких территориальных зонах

Сообщение ginpetr » 06 окт 2014, 13:14

На реальных проектах обновление динамических временных колонок оказалось ОЧЕНЬ ресурсоёмким. Так что редактированием в реальном времени это не назовёшь - после малейшей перестановки узла зоны программа минуту висит. :cry:

Аватара пользователя
ginpetr
Завсегдатай
Сообщения: 385
Зарегистрирован: 21 июн 2011, 12:07
Репутация: 140
Откуда: Орск
Контактная информация:

Re: Нахождение одного ЗУ в нескольких территориальных зонах

Сообщение ginpetr » 06 окт 2014, 14:21

Оптимизировал немного:

Добавление колонок
Add Column "участки" (psS) From Зоны Set To proportion sum(Area(Object, "sq m")) Where contains Dynamic
Add Column "участки" (cnt) From Зоны Set To Count(*) Where intersects Dynamic

Тематика по выражению
Round(psS, 0.01)<>Round(Area(Object, "sq m"), 0.01) and psS>0 and cnt>0

Работает быстрее, но имеет некоторые недостатки (не все ошибки выявляются); 0.01 точность совпадения площадей (избыточная, пересечения очень трудно найти, поэтому сам ставлю 1)
Последний раз редактировалось ginpetr 07 окт 2014, 11:42, всего редактировалось 3 раза.

Boris
Гуру
Сообщения: 4231
Зарегистрирован: 10 апр 2006, 22:34
Репутация: -344969098
Откуда: Париж

Re: Нахождение одного ЗУ в нескольких территориальных зонах

Сообщение Boris » 06 окт 2014, 14:31

ginpetr писал(а):На реальных проектах обновление динамических временных колонок оказалось ОЧЕНЬ ресурсоёмким. Так что редактированием в реальном времени это не назовёшь - после малейшей перестановки узла зоны программа минуту висит. :cry:
смешно самого себя цитировать:
По опыту в Geomedia, знаю, что при сложном или вложенном запросе, такое может "убить" всякую осмысленную работу, за счет постоянного пересчета окна и запросов. ;(
Видимо это знали и разработчики Mapinfo еще в очень далекую эпоху создания продукта. С тех пор производительность выросла на порядки, но принципиально квадратичность времени от количества узлов и доступной памяти (32-х разрядности) не изменишь.

Ответить

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

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

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