Estoy trabajando para hacer proyectos hidrológicos usando QGIS y una hoja de cálculo de Excel que tengo. Para hacer esto, quiero extraer alguna información de las líneas, incluida en una capa vectorial, que representa una sección de tubería.
La información que necesito extraer es:
- Número de identificación
- Longitud
- X, Y coordenadas de inicio y fin
He encontrado una manera de capturar este campo usando el "$ length" y otro algoritmo para las coordenadas X e Y, pero para eso necesito abrir la tabla de Atributos, poner las expresiones en cada columna de atributos y hacer clic para actualizar los campos.
¿Hay alguna forma de dibujar una línea cuando estos campos se completan automáticamente? Es decir, dibujo / edito una línea (inicio de edición o nodo final) y cuando abro la tabla de atributos, los campos de longitud y las coordenadas X, Y se rellenan y actualizan.
fuente
Respuestas:
Si solo necesita estos campos dentro de QGIS , puede usar campos virtuales. Permiten usar una expresión (como
$length
) que depende de otros valores o de la geometría.Abra la calculadora de campo, agregue un nuevo campo con la longitud del nombre, marque la casilla de verificación "Campo virtual" e ingrese
$length
como expresión (o algo más para los otros campos).Sin embargo, estos no se guardarán en el archivo de Excel.
Si desea mantener un archivo de Excel sincronizado con un archivo shp para geometría e incluir campos derivados en el archivo de Excel, hay un complemento llamado ShpSync que conoce este concepto y actualiza los campos automáticamente cuando las características se cambian, agregan o eliminan.
fuente
¡Interesante pregunta! No conozco ninguna otra forma de lograr lo que quieres, pero usando PyQGIS.
Lee el código a continuación. Tiene algunos textos en que:
'lines'
,'length'
,'startX'
,'startY'
,'endX'
,'endY'
. Puede ajustar esos nombres en el script para que funcione en sus datos. El primero es su nombre de capa, mientras que el resto corresponde a los nombres de campo. Supongo que su capa de línea tiene esos campos (después de todo, desea que los valores se escriban allí).Una vez que haya ajustado el nombre de su capa y los nombres de los campos que desea actualizar automáticamente, copie y pegue el script en la consola QGIS Python.
Si todo va bien, debería poder ver que los valores de campo se actualizan automáticamente en dos escenarios: 1) Cuando se agregan nuevas características y 2) Cuando se modifican las geometrías.
Así es como funciona:
Si tiene algún problema al ejecutar el script, agregue un comentario debajo de esta respuesta.
Puede ser útil para usted tener esta funcionalidad ya disponible cuando abra su proyecto QGIS. Si ese es el caso, dígame, podría publicar instrucciones para hacerlo.
EDITAR:
Para que esta funcionalidad esté disponible cada vez que abra su proyecto QGIS (es decir, un
.qgs
archivo que contenga, entre otros, su capa de línea), debe seguir estos pasos:Vaya a
QGIS->Project->Project Properties->Macros
, marque laPython macros
opción y reemplace todo el código con este (ajuste los valores que indican los nombres de sus capas y campos):Asegúrese de habilitar las macros en su proyecto, de esta manera:
Settings->Options->General->Enable macros: Always
.Guarde su proyecto QGIS.
Ahora, cada vez que abra el
.qgs
archivo que acaba de guardar, los atributos de su capa de línea se actualizarán automáticamente cuando agregue una nueva característica o modifique una geometría (es decir, ya no es necesario copiar nada en la Consola QGIS Python).2da EDICIÓN:
Acabo de publicar un complemento llamado AutoFields para ayudar a las personas a resolver este tipo de problemas. Incluso hice un video que muestra cómo resolver su problema, puede verlo en:
https://vimeo.com/germap/autofields-geometric-properties
Documentación de AutoFields: http://geotux.tuxfamily.org/index.php/en/geo-blogs/item/333-autofields-plugin-for-qgis
fuente
myLayer = QgsMapLayerRegistry.instance().mapLayersByName( 'Tramo' )[0]
Si está realmente interesado en mi futuro complemento, envíeme cualquier sugerencia que tenga, le agradecería. Puedes contactarme en GeoTux .Para QGIS 3, vaya a
Layers Properties
=>Attributes Form
=> elija su campo con valores de geometría (por ejemplo,area
) => escriba$area
en elDefaults value
cuadro y marqueApply default value on update
. Esto también podría ser útil:$perimeter
,$y
,$x
,$id
fuente
Pondría los datos en una base de datos (PostGIS) y extraería los datos a QGIS con una vista (probablemente materializada).
fuente