Я работаю над тем, чтобы делать гидрологические проекты, используя QGIS и рабочий лист Excel, который у меня есть. Для этого я хочу извлечь некоторую информацию о линиях, включенных в векторный слой, который представляет сечение трубы.
Информация, которую мне нужно извлечь:
- Идентификационный номер
- длина
- X, Y начальная и конечная координаты
Я нашел способ захватить это поле, используя $ length и другой алгоритм для координат X и Y, но для этого мне нужно открыть таблицу атрибутов, поместить выражения в каждый столбец атрибута и щелкнуть, чтобы обновить поля.
Есть ли способ, когда я рисую линию, эти поля заполняются автоматически? То есть я рисую / редактирую линию (начало редактирования или конечный узел), и когда я открываю таблицу атрибутов, поля длины и координаты X, Y заполняются и обновляются.
qgis
vector
autofields
LeoNazareth
источник
источник
Ответы:
Если вам нужны только эти поля внутри QGIS , вы можете использовать виртуальные поля. Это позволяет использовать выражение (например
$length
), которое зависит от других значений или геометрии.Откройте калькулятор полей, добавьте новое поле с длиной имени, установите флажок «Виртуальное поле» и введите в
$length
качестве выражения (или что-то еще для других полей).Однако они не будут сохранены в файл Excel.
Если вы хотите синхронизировать файл Excel с файлом shp для геометрии и включить производные поля в файл Excel, существует плагин ShpSync, который знает об этой концепции и автоматически обновляет поля при изменении, добавлении или удалении объектов.
источник
Интересный вопрос! Я не знаю ни одного другого способа достижения того, чего вы хотите, кроме использования PyQGIS.
Прочитайте код ниже. Он имеет некоторые тексты в нем:
'lines'
,'length'
,'startX'
,'startY'
,'endX'
,'endY'
. Вы можете настроить эти имена в скрипте, чтобы он работал с вашими данными. Первый - это имя слоя, а остальные соответствуют именам полей. Я предполагаю, что ваш линейный слой имеет эти поля (в конце концов, вы хотите, чтобы значения были записаны там).После того, как вы настроили имя слоя и имена полей, которые вы хотите автоматически обновлять, скопируйте и вставьте скрипт в консоль QGIS Python.
Если все идет хорошо, вы должны увидеть, что значения полей автоматически обновляются в двух сценариях: 1) при добавлении новых объектов и 2) при изменении геометрии.
Вот как это работает:
Если у вас возникли проблемы во время работы скрипта, добавьте комментарий под этим ответом.
Возможно, вам будет удобно иметь эту функцию уже при открытии проекта QGIS. Если это так, скажите мне, я мог бы опубликовать инструкции, чтобы сделать это.
РЕДАКТИРОВАТЬ:
Чтобы эта функция была доступна каждый раз, когда вы открываете свой проект QGIS (т. Е.
.qgs
Файл, содержащий, среди прочего, ваш линейный слой), вам необходимо выполнить следующие шаги:Перейдите
QGIS->Project->Project Properties->Macros
, отметьтеPython macros
опцию и замените весь код на этот (отрегулируйте значения, обозначающие ваш слой и имена полей):Убедитесь , что вы включить макросы на ваш проект, таким образом:
Settings->Options->General->Enable macros: Always
.Сохраните свой проект QGIS.
Теперь, каждый раз, когда вы открываете
.qgs
файл, который вы только что сохранили, атрибуты вашего линейного слоя будут автоматически обновляться при добавлении новой функции или изменении геометрии (т. Е. Больше не нужно ничего копировать в консоль QGIS Python).2-е РЕДАКТИРОВАНИЕ:
Я только что опубликовал плагин под названием AutoFields, чтобы помочь людям решать подобные проблемы. Я даже сделал видео, показывающее, как решить вашу проблему, вы можете посмотреть его по адресу:
https://vimeo.com/germap/autofields-geometric-properties
Документация AutoFields: http://geotux.tuxfamily.org/index.php/en/geo-blogs/item/333-autofields-plugin-for-qgis
источник
myLayer = QgsMapLayerRegistry.instance().mapLayersByName( 'Tramo' )[0]
Если вам действительно интересен мой будущий плагин, присылайте мне любые ваши предложения, я был бы признателен. Вы можете связаться со мной в GeoTux .Для QGIS 3 перейдите в
Layers Properties
=>Attributes Form
=> выберите ваше поле со значениями геометрии (например,area
) => введите$area
вDefaults value
поле и отметьтеApply default value on update
. Это также может быть полезным:$perimeter
,$y
,$x
,$id
источник
Я помещал данные в базу данных (PostGIS) и извлекал данные в QGIS с (вероятно, материализованным) представлением.
источник