Ошибка определения количества объектов через вызов itemsInRect(r)

Ошибки при работе с ГИС Аксиома
Ответить
Аватара пользователя
Mitrich
Сообщения: 22
Зарегистрирован: 21 фев 2024, 11:45

Ошибка определения количества объектов через вызов itemsInRect(r)

Сообщение Mitrich » 23 май 2024, 14:29

День добрый, уважаемые разработчики!

При использовании скрипта
scene = view_manager.active.scene_rect
layer.data_object
r = Rect(scene.xmin, scene.ymin, scene.xmax, scene.ymax)
items = tab.itemsInRect(r)

количество объектов в переменной items не соответствует количеству объектов на экране ( выбирается 4 площадных объекта, при этом отображается на экране 2 площадных объекта типа Polygon)
tab.count(bbox=r) также возвращает неправильное количество объектов

При попытке использования itemsInObject
rectangle = Rectangle(r)
items = tab.itemsInObject(rectangle)

получаю ошибку:
"Ошибка при выполнении запроса QuerySelectInObject к таблице PPT2_OBJ по атрибутам (Реестровый_номер, Этап, НПА, НПА_Дата, НПА_Номер, Номер_дела, Номер_эл_вер,...)"

[Info ] 16:43:00.245 <void axioma::Core::printSystemInfo()> "Архитектура: x86_64"
[Info ] 16:43:00.245 <void axioma::Core::printSystemInfo()> "x86_64-little_endian-lp64"
[Info ] 16:43:00.245 <void axioma::Core::printSystemInfo()> "linux"
[Info ] 16:43:00.245 <void axioma::Core::printSystemInfo()> "5.15.0-70-generic"
[Info ] 16:43:00.246 <void axioma::Core::printSystemInfo()> "Current OS:" "Astra Linux"
[Info ] 16:43:00.246 <void axioma::Core::printSystemInfo()> "Build OS:" "Astra Linux 1.7_x86-64"
[Info ] 16:43:00.246 <void axioma::Core::printSystemInfo()> "Дата и время сборки: Apr 10 2024 11:55:21"
[Info ] 16:43:00.246 <void axioma::Core::printSystemInfo()> "a296e5c53c0da03b6c31fc72f33869b0481f4e65"
[Info ] 16:43:00.246 <void axioma::Core::printSystemInfo()> "Qt version:" 5.15.10
[Info ] 16:43:00.246 <void axioma::Core::printSystemInfo()> "Бесплатная лицензия"
[Info ] 16:43:00.377 <void axioma::Core::printSystemInfo()> HWID: iE+M+bEsJbCTbduWahRXMA==
[Info ] 16:43:00.377 <void axioma::Core::printSystemInfo()> AXIOMA_HOME: "/opt/axioma-gis5/sbin"
[Info ] 16:43:00.377 <void axioma::Core::printSystemInfo()> AXIOMA_DATA: "/opt/axioma-gis5/share/axioma"
[Info ] 16:43:00.377 <void axioma::Core::printSystemInfo()> Application file path: "/opt/axioma-gis5/bin/Axioma.GIS"
Аватара пользователя
Александр
Сообщения: 464
Зарегистрирован: 18 апр 2019, 08:21

Re: Ошибка определения количества объектов через вызов itemsInRect(r)

Сообщение Александр » 23 май 2024, 18:16

Mitrich писал(а): 23 май 2024, 14:29 items = tab.itemsInRect(r)
количество объектов в переменной items не соответствует количеству объектов на экране ( выбирается 4 площадных объекта, при этом отображается на экране 2 площадных объекта типа Polygon)
tab.count(bbox=r) также возвращает неправильное количество объектов
Оба эти метода функционируют с использованием MBR (Minimum Bounding Rectangle - минимального ограничивающего прямоугольника).
Они определяют пересечение не геометрий напрямую, а пересечение их MBR. Если MBR объектов не пересекаются, значит, и сами объекты не пересекаются.
Это позволяет быстро исключить ненужные данные, хотя результат может быть неточным. Таким образом, результат, полученный вами, скорее всего, правильный.
При попытке использования itemsInObject
rectangle = Rectangle(r)
items = tab.itemsInObject(rectangle)

получаю ошибку:
Да, может возникать ошибка, если в таблице есть несохранённые данные.
Мы обязательно исправим ошибку в ближайшее время, а пока можно или сохранить данные:

Code: Select all

tab.commit()
перед вызовом itemsInObject
или воспользоваться itemsInRect, а затем из полученных объектов выбрать пересекающиеся.

Code: Select all

import axipy as axp

rectangle = axp.Rectangle(r, cs=tab.coordsystem)
list(itm for itm in tab.itemsInRect(r) if rectangle.intersects(itm.geometry))
Аватара пользователя
Mitrich
Сообщения: 22
Зарегистрирован: 21 фев 2024, 11:45

Re: Ошибка определения количества объектов через вызов itemsInRect(r)

Сообщение Mitrich » 24 май 2024, 06:15

День добрый!

Спасибо большое за разъяснение!
Аватара пользователя
gisamap
Сообщения: 236
Зарегистрирован: 18 окт 2019, 08:03

Re: Ошибка определения количества объектов через вызов itemsInRect(r)

Сообщение gisamap » 24 май 2024, 07:43

Использование itemsInObject или itemsInRect в некоторых случаях работает быстрее чем поиск через Sql
Ответить