Страница 2 из 3
Re: Нахождение одного ЗУ в нескольких территориальных зонах
Добавлено: 02 окт 2014, 16:50
gamm
thegeo писал(а):Приведу еще раз картинку с результатом выполненного запроса.
еще раз сообщаю, что на картинке нет ни одного участка, целиком лежащего в одной зоне (а только такие являются правильными; нарисованный у вас участок вне всех зон - тоже ошибочный). Нарисуйте такой , и ваш запрос и его найдет, а не только тех, кто лежит в более чем одной зоне.
Re: Нахождение одного ЗУ в нескольких территориальных зонах
Добавлено: 03 окт 2014, 06:07
ginpetr
Нет, мой способ не годится. Там всё от положения центроида очень зависит. Как исправить пока не знаю.
Re: Нахождение одного ЗУ в нескольких территориальных зонах
Добавлено: 03 окт 2014, 07:03
ginpetr
Уже знаю как исправить.
Нужна ещё одна временная колонка со значением "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")
пока испытания успешные.
Re: Нахождение одного ЗУ в нескольких территориальных зонах
Добавлено: 03 окт 2014, 12:53
gamm
ginpetr писал(а):Уже знаю как исправить.
а что мешает использовать group by для объединения по пересечению, и считать число участков, для который площадь пересечения > 0 - для "правильный участков это число равно 1. Тогда временные колонки не нужны.
Re: Нахождение одного ЗУ в нескольких территориальных зонах
Добавлено: 03 окт 2014, 20:46
ginpetr
gamm писал(а):ginpetr писал(а):Уже знаю как исправить.
а что мешает использовать group by для объединения по пересечению, и считать число участков, для который площадь пересечения > 0 - для "правильный участков это число равно 1. Тогда временные колонки не нужны.
Не понимаю, как это реализовать. Можно хоть чуть-чуть подробнее?
Мой последний способ логически верен на 100% (пока я в этом уверен), но на практике почему- то psumSint<>Sobj ( расшифровка выше) выполняется для участка, где эти два значения заведомо равны. Причина или в округлении одного из них, или в разных расчётах ( сфера/плоскость). Доберусь до мапинфо - выясню.
Запрос thegeo работает и уже может использоваться, но для моей работы нужен результат "в реальном времени".
Re: Нахождение одного ЗУ в нескольких территориальных зонах
Добавлено: 04 окт 2014, 15:10
gamm
ginpetr писал(а):Не понимаю, как это реализовать. Можно хоть чуть-чуть подробнее?
это обычный SQL, который в Мапинфо реализован через поля формы (там есть поля типа Group by Column), группировка по ID участка, подсчет count(*). Как-то так, если ничего за последние 10 лет не поменяли ...
Re: Нахождение одного ЗУ в нескольких территориальных зонах
Добавлено: 04 окт 2014, 22:54
Boris
Единственно, я бы для краткости и удобства предложил использовать ф-ию
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 ).
Re: Нахождение одного ЗУ в нескольких территориальных зонах
Добавлено: 04 окт 2014, 22:58
Boris
gamm писал(а):ginpetr писал(а):Уже знаю как исправить.
а что мешает использовать group by для объединения по пересечению, и считать число участков, для который площадь пересечения > 0 - для "правильный участков это число равно 1. Тогда временные колонки не нужны.
По моему этот способ не сработает для участка, который имеет пересечение, но только с одной границей (уч.24) в примере. У него то же получается значение 1. И, к стати, это условие возможно реализовать и через добавление временной колонки. Правда, у меня оно на примере срабатывает во множестве мест. Но как сказано выше, это может быть следствием неточности (нетопологичности) разных таблиц в Mapinfo.
Re: Нахождение одного ЗУ в нескольких территориальных зонах
Добавлено: 04 окт 2014, 23:12
Boris
Я предлагаю как то сузить задачу, если ее решение еще нужно, а то она разрослась в разные стороны. И запросы и тематика, и группировка. Давайте вернемся к постановке задачи, а то решать задачу о стольких переменных не хватает глубины перебора.
Я понимаю задачу так:
Надо составить такое тематическое выражение, что бы видеть "участки", пересекающие "зоны". Это связано с тем, что тематика обновляется автоматически после исправления участка, а запрос - нет.
Проблемы с составлением запроса - нет. Эта часть задачи уже решена.
Дополнительное условие: желательно отклонять участки, которые номинально пересекают границу только за счет незначительной (+-2 см) неточности координат границ.
PS
Я раньше как то не вникал в проблему обновления запросов, но поскольку в механизме Mapinfo, события для обновления окна и изменения кол-ва выделенных элементов присутствуют, может кто то встречал и приложение на MapBasic'е, которое обновляет запросы в окне после обновления окна?
По опыту в Geomedia, знаю, что при сложном или вложенном запросе, такое может "убить" всякую осмысленную работу, за счет постоянного пересчета окна и запросов. ;(
Re: Нахождение одного ЗУ в нескольких территориальных зонах
Добавлено: 05 окт 2014, 17:10
thegeo
Получить нужный результат с использованием тематической карты у меня не получилось, поэтому предлагаю небольшую программку, в которой вынес на кнопку указанный выше запрос с некоторыми дополнениями (MB v.11.5). Здесь же сам код, если у кого-то возникнет желание поэкспериментировать.
В принципе можно было бы использовать процедуру WinChangedHandler. Не пробовал.
Re: Нахождение одного ЗУ в нескольких территориальных зонах
Добавлено: 06 окт 2014, 07:24
ginpetr
В моей последней формуле
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) - для участков пересекающих зоны
Re: Нахождение одного ЗУ в нескольких территориальных зонах
Добавлено: 06 окт 2014, 08:02
ginpetr
Раньше было много задумок, которые логично было посадить на WinChangedHandler. Но испытания показали, что её использование часто вызывает "вылет" программы с потерей всего несохранённого.
Re: Нахождение одного ЗУ в нескольких территориальных зонах
Добавлено: 06 окт 2014, 13:14
ginpetr
На реальных проектах обновление динамических временных колонок оказалось ОЧЕНЬ ресурсоёмким. Так что редактированием в реальном времени это не назовёшь - после малейшей перестановки узла зоны программа минуту висит.

Re: Нахождение одного ЗУ в нескольких территориальных зонах
Добавлено: 06 окт 2014, 14:21
ginpetr
Оптимизировал немного:
Добавление колонок
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)
Re: Нахождение одного ЗУ в нескольких территориальных зонах
Добавлено: 06 окт 2014, 14:31
Boris
ginpetr писал(а):На реальных проектах обновление динамических временных колонок оказалось ОЧЕНЬ ресурсоёмким. Так что редактированием в реальном времени это не назовёшь - после малейшей перестановки узла зоны программа минуту висит.

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