День добрый, уважаемые разработчики!
При использовании скрипта
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"
Ошибка определения количества объектов через вызов itemsInRect(r)
Re: Ошибка определения количества объектов через вызов itemsInRect(r)
Оба эти метода функционируют с использованием MBR (Minimum Bounding Rectangle - минимального ограничивающего прямоугольника).Mitrich писал(а): ↑23 май 2024, 14:29 items = tab.itemsInRect(r)
количество объектов в переменной items не соответствует количеству объектов на экране ( выбирается 4 площадных объекта, при этом отображается на экране 2 площадных объекта типа Polygon)
tab.count(bbox=r) также возвращает неправильное количество объектов
Они определяют пересечение не геометрий напрямую, а пересечение их MBR. Если MBR объектов не пересекаются, значит, и сами объекты не пересекаются.
Это позволяет быстро исключить ненужные данные, хотя результат может быть неточным. Таким образом, результат, полученный вами, скорее всего, правильный.
Да, может возникать ошибка, если в таблице есть несохранённые данные.При попытке использования itemsInObject
rectangle = Rectangle(r)
items = tab.itemsInObject(rectangle)
получаю ошибку:
Мы обязательно исправим ошибку в ближайшее время, а пока можно или сохранить данные:
Code: Select all
tab.commit()
или воспользоваться 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))
Re: Ошибка определения количества объектов через вызов itemsInRect(r)
День добрый!
Спасибо большое за разъяснение!
Спасибо большое за разъяснение!
Re: Ошибка определения количества объектов через вызов itemsInRect(r)
Использование itemsInObject или itemsInRect в некоторых случаях работает быстрее чем поиск через Sql