еще раз сообщаю, что на картинке нет ни одного участка, целиком лежащего в одной зоне (а только такие являются правильными; нарисованный у вас участок вне всех зон - тоже ошибочный). Нарисуйте такой , и ваш запрос и его найдет, а не только тех, кто лежит в более чем одной зоне.thegeo писал(а):Приведу еще раз картинку с результатом выполненного запроса.
Нахождение одного ЗУ в нескольких территориальных зонах
-
- Гуру
- Сообщения: 4168
- Зарегистрирован: 15 окт 2010, 08:33
- Репутация: 1107
- Ваше звание: программист
- Откуда: Казань
Re: Нахождение одного ЗУ в нескольких территориальных зонах
- ginpetr
- Завсегдатай
- Сообщения: 385
- Зарегистрирован: 21 июн 2011, 12:07
- Репутация: 140
- Откуда: Орск
- Контактная информация:
Re: Нахождение одного ЗУ в нескольких территориальных зонах
Нет, мой способ не годится. Там всё от положения центроида очень зависит. Как исправить пока не знаю.
- ginpetr
- Завсегдатай
- Сообщения: 385
- Зарегистрирован: 21 июн 2011, 12:07
- Репутация: 140
- Откуда: Орск
- Контактная информация:
Re: Нахождение одного ЗУ в нескольких территориальных зонах
Уже знаю как исправить.
Нужна ещё одна временная колонка со значением "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")
пока испытания успешные.
Нужна ещё одна временная колонка со значением "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")
пока испытания успешные.
-
- Гуру
- Сообщения: 4168
- Зарегистрирован: 15 окт 2010, 08:33
- Репутация: 1107
- Ваше звание: программист
- Откуда: Казань
Re: Нахождение одного ЗУ в нескольких территориальных зонах
а что мешает использовать group by для объединения по пересечению, и считать число участков, для который площадь пересечения > 0 - для "правильный участков это число равно 1. Тогда временные колонки не нужны.ginpetr писал(а):Уже знаю как исправить.
- ginpetr
- Завсегдатай
- Сообщения: 385
- Зарегистрирован: 21 июн 2011, 12:07
- Репутация: 140
- Откуда: Орск
- Контактная информация:
Re: Нахождение одного ЗУ в нескольких территориальных зонах
Не понимаю, как это реализовать. Можно хоть чуть-чуть подробнее?gamm писал(а):а что мешает использовать group by для объединения по пересечению, и считать число участков, для который площадь пересечения > 0 - для "правильный участков это число равно 1. Тогда временные колонки не нужны.ginpetr писал(а):Уже знаю как исправить.
Мой последний способ логически верен на 100% (пока я в этом уверен), но на практике почему- то psumSint<>Sobj ( расшифровка выше) выполняется для участка, где эти два значения заведомо равны. Причина или в округлении одного из них, или в разных расчётах ( сфера/плоскость). Доберусь до мапинфо - выясню.
Запрос thegeo работает и уже может использоваться, но для моей работы нужен результат "в реальном времени".
-
- Гуру
- Сообщения: 4168
- Зарегистрирован: 15 окт 2010, 08:33
- Репутация: 1107
- Ваше звание: программист
- Откуда: Казань
Re: Нахождение одного ЗУ в нескольких территориальных зонах
это обычный SQL, который в Мапинфо реализован через поля формы (там есть поля типа Group by Column), группировка по ID участка, подсчет count(*). Как-то так, если ничего за последние 10 лет не поменяли ...ginpetr писал(а):Не понимаю, как это реализовать. Можно хоть чуть-чуть подробнее?
-
- Гуру
- Сообщения: 4231
- Зарегистрирован: 10 апр 2006, 22:34
- Репутация: -344969098
- Откуда: Париж
Re: Нахождение одного ЗУ в нескольких территориальных зонах
Единственно, я бы для краткости и удобства предложил использовать ф-ию 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 ).
-
- Гуру
- Сообщения: 4231
- Зарегистрирован: 10 апр 2006, 22:34
- Репутация: -344969098
- Откуда: Париж
Re: Нахождение одного ЗУ в нескольких территориальных зонах
По моему этот способ не сработает для участка, который имеет пересечение, но только с одной границей (уч.24) в примере. У него то же получается значение 1. И, к стати, это условие возможно реализовать и через добавление временной колонки. Правда, у меня оно на примере срабатывает во множестве мест. Но как сказано выше, это может быть следствием неточности (нетопологичности) разных таблиц в Mapinfo.gamm писал(а):а что мешает использовать group by для объединения по пересечению, и считать число участков, для который площадь пересечения > 0 - для "правильный участков это число равно 1. Тогда временные колонки не нужны.ginpetr писал(а):Уже знаю как исправить.
-
- Гуру
- Сообщения: 4231
- Зарегистрирован: 10 апр 2006, 22:34
- Репутация: -344969098
- Откуда: Париж
Re: Нахождение одного ЗУ в нескольких территориальных зонах
Я предлагаю как то сузить задачу, если ее решение еще нужно, а то она разрослась в разные стороны. И запросы и тематика, и группировка. Давайте вернемся к постановке задачи, а то решать задачу о стольких переменных не хватает глубины перебора.
Я понимаю задачу так:
Надо составить такое тематическое выражение, что бы видеть "участки", пересекающие "зоны". Это связано с тем, что тематика обновляется автоматически после исправления участка, а запрос - нет.
Проблемы с составлением запроса - нет. Эта часть задачи уже решена.
Дополнительное условие: желательно отклонять участки, которые номинально пересекают границу только за счет незначительной (+-2 см) неточности координат границ.
PS
Я раньше как то не вникал в проблему обновления запросов, но поскольку в механизме Mapinfo, события для обновления окна и изменения кол-ва выделенных элементов присутствуют, может кто то встречал и приложение на MapBasic'е, которое обновляет запросы в окне после обновления окна?
По опыту в Geomedia, знаю, что при сложном или вложенном запросе, такое может "убить" всякую осмысленную работу, за счет постоянного пересчета окна и запросов. ;(
Я понимаю задачу так:
Надо составить такое тематическое выражение, что бы видеть "участки", пересекающие "зоны". Это связано с тем, что тематика обновляется автоматически после исправления участка, а запрос - нет.
Проблемы с составлением запроса - нет. Эта часть задачи уже решена.
Дополнительное условие: желательно отклонять участки, которые номинально пересекают границу только за счет незначительной (+-2 см) неточности координат границ.
PS
Я раньше как то не вникал в проблему обновления запросов, но поскольку в механизме Mapinfo, события для обновления окна и изменения кол-ва выделенных элементов присутствуют, может кто то встречал и приложение на MapBasic'е, которое обновляет запросы в окне после обновления окна?
По опыту в Geomedia, знаю, что при сложном или вложенном запросе, такое может "убить" всякую осмысленную работу, за счет постоянного пересчета окна и запросов. ;(
-
- Активный участник
- Сообщения: 161
- Зарегистрирован: 17 янв 2012, 18:51
- Репутация: 74
Re: Нахождение одного ЗУ в нескольких территориальных зонах
Получить нужный результат с использованием тематической карты у меня не получилось, поэтому предлагаю небольшую программку, в которой вынес на кнопку указанный выше запрос с некоторыми дополнениями (MB v.11.5). Здесь же сам код, если у кого-то возникнет желание поэкспериментировать.
В принципе можно было бы использовать процедуру WinChangedHandler. Не пробовал.
В принципе можно было бы использовать процедуру WinChangedHandler. Не пробовал.
- Вложения
-
- miHG028.png (29.62 КБ) 9996 просмотров
-
findIntersections.zip
- (3.17 КБ) 318 скачиваний
- ginpetr
- Завсегдатай
- Сообщения: 385
- Зарегистрирован: 21 июн 2011, 12:07
- Репутация: 140
- Откуда: Орск
- Контактная информация:
Re: Нахождение одного ЗУ в нескольких территориальных зонах
В моей последней формуле
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 выполнить набор команд, по добавлению новых динамических колонок
и построить тематику отдельных значений по выражению
S<>paS or Round(psS, 0.01)<>Round(Area(Object, "sq m"), 0.01) and psS>0
Т(True) - для участков пересекающих зоны
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: Нахождение одного ЗУ в нескольких территориальных зонах
Раньше было много задумок, которые логично было посадить на WinChangedHandler. Но испытания показали, что её использование часто вызывает "вылет" программы с потерей всего несохранённого.
- ginpetr
- Завсегдатай
- Сообщения: 385
- Зарегистрирован: 21 июн 2011, 12:07
- Репутация: 140
- Откуда: Орск
- Контактная информация:
Re: Нахождение одного ЗУ в нескольких территориальных зонах
На реальных проектах обновление динамических временных колонок оказалось ОЧЕНЬ ресурсоёмким. Так что редактированием в реальном времени это не назовёшь - после малейшей перестановки узла зоны программа минуту висит. 

- ginpetr
- Завсегдатай
- Сообщения: 385
- Зарегистрирован: 21 июн 2011, 12:07
- Репутация: 140
- Откуда: Орск
- Контактная информация:
Re: Нахождение одного ЗУ в нескольких территориальных зонах
Оптимизировал немного:
Добавление колонок
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)
Добавление колонок
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 раза.
-
- Гуру
- Сообщения: 4231
- Зарегистрирован: 10 апр 2006, 22:34
- Репутация: -344969098
- Откуда: Париж
Re: Нахождение одного ЗУ в нескольких территориальных зонах
смешно самого себя цитировать:ginpetr писал(а):На реальных проектах обновление динамических временных колонок оказалось ОЧЕНЬ ресурсоёмким. Так что редактированием в реальном времени это не назовёшь - после малейшей перестановки узла зоны программа минуту висит.
Видимо это знали и разработчики Mapinfo еще в очень далекую эпоху создания продукта. С тех пор производительность выросла на порядки, но принципиально квадратичность времени от количества узлов и доступной памяти (32-х разрядности) не изменишь.По опыту в Geomedia, знаю, что при сложном или вложенном запросе, такое может "убить" всякую осмысленную работу, за счет постоянного пересчета окна и запросов. ;(
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость