34 votos

¿Cómo editar fácilmente datos de atributos usando Expresiones Regulares?

Estoy escribiendo un tutorial para estudiantes de MSc que utiliza QGIS. Una de las tareas requiere modificar los datos de atributos (consulte el borrador en PDF del tutorial aquí si está interesado).

La pregunta es cómo hacer que editen los datos de atributos. Sé que esta pregunta ha sido hecha antes, y la respuesta solía ser simple: solo use LibreOffice calc para modificarlo y luego guárdelo, asegurando que se mantenga el orden de las filas y los títulos de las columnas. He utilizado este enfoque antes con gran efecto.

Desafortunadamente, la solución ya no funciona: guardar el archivo .dbf en LibreOffice (5.4.2) o OpenOffice (3.2.1) Calc desordena los datos desde la perspectiva de QGIS (solo aparecen números enteros aleatorios en la tabla de atributos) y crea un archivo .dbt adicional en su lugar.

Entonces, para llegar a la pregunta: ¿cómo les digo a una clase de estudiantes de MSc que hagan esto la próxima semana? He considerado las siguientes opciones:

  1. Usar R en su lugar (genial para mí, pero aterrador para los estudiantes)
  2. Editar el archivo como .csv y luego unirlo basado en la marca de tiempo (bien, pero parece demasiado complejo y podría introducir más errores en la práctica de 2 horas)
  3. Usar un programa alternativo: he probado Gnumeric y Excel, ninguno de los cuales generó buenos resultados rápidamente.

Para ayudar a responder a esta pregunta, he creado un ejemplo replicable. Abra el archivo "points.shp" en QGIS, observe la tabla de atributos y luego cierre. Edite un par de celdas en la tabla de atributos "points.dbf" en LibreOffice, guarde. Vuelva a abrir "points.shp" en QGIS y observe la tabla de atributos desordenada. Los otros shapefiles en la carpeta .zip ya han sido corruptos por LibreOffice y OpenOffice para ilustrar cómo se ve el problema para mí.

En resumen, ¿cómo puedo resolver mejor este problema?

2 votos

Bienvenido al sitio, me gustaría decir que esta es una pregunta muy bien formulada y, con suerte, podemos encontrar algunas soluciones buenas. Supongo que un poco de python está fuera de discusión para estos estudiantes, ya que así es como abordaría este problema en primera instancia...

14 votos

Directamente editar la parte .DBF de un shapefile es demasiado peligroso para recomendar su uso rutinario y no debe ser utilizado por principiantes en absoluto, al menos no si a alguien le importan los datos. Sin embargo, hay una solución más fiable de naturaleza similar disponible: mantener un campo de identificador único en el shapefile. Nunca lo edites. En su lugar, guarda los atributos en una tabla relacionada (en cualquier formato que tu SIG pueda leer), unido mediante el mismo identificador. Ahora, en gran medida, puedes editar la tabla de atributos libremente sin perder la conexión entre la forma y el atributo, siempre y cuando protejas el campo de identificador.

1 votos

Las soluciones en Python estarían bien, siempre y cuando sean fáciles de implementar y entender ... En cuanto a mantener un número de identificación, esa es una buena opción (opción 2 en mi pregunta) y probablemente mi respuesta predeterminada. Sin embargo, esperaba una "solución rápida" más sencilla que no involucrara archivos adicionales (¡5 por archivo de forma ya son suficientes en mi opinión!)

20voto

Joe Puntos 2507

La respuesta más sencilla que he encontrado, basada en el consejo de Ryan Garnett de hacerlo dentro de QGIS:

Utiliza regexp_replace

Esta funcionalidad se añadió al calculador de campos hace 1 año por Jürgen Fischer (como se ilustra en este informe de bug). Intenté por un tiempo descubrir cómo hacer esto, pero fallé buscando "qgis regex" y otros términos vagos.

Su funcionalidad probablemente se ilustre mejor con la necesidad de estandarizar todos los valores en la columna de "nombre". Por ejemplo, si necesitamos reemplazar todas las celdas que contienen el patrón "Tesc" con 'Tesco', eliminando información superflua como "Tesco, Infirmary Road" (que los contribuyentes de OSM añaden frecuentemente), se puede usar la siguiente función:

regexp_replace("name", 'Tesc.*','Tesco')

enter image description here

Supongo que esta es una funcionalidad de expresión regular en Python, ya que es un poco diferente de grep, que he usado antes.

Creo que se necesita más documentación (detalle en el sitio web de QGIS) sobre cómo funciona esto, así que he marcado las siguientes páginas para referencia futura:

Esta solución tiene un par de ventajas:

  1. Sencillo: no se necesitan programas o complementos adicionales
  2. Introduce a los estudiantes al poder de las expresiones regulares, utilizando funciones (¿Pythonic?) (la "'" que representa texto es interesante. Advertencia: " o ningún símbolo falla) y funciones de línea de comandos.

Disculpas por responder a mi propia pregunta, ¡y muchas gracias a los demás por guiarme hacia la luz! Espero que este hilo de preguntas sea de utilidad educativa para otros que enfrentan problemas similares.

3 votos

No te preocupes, responder tus propias preguntas no es un problema.

0 votos

Estoy contento de que hayas encontrado algo que te ayudará. Gracias por compartir, sé que yo también usaré esto.

1 votos

Le pregunté a los desarrolladores de QGIS, es regex de Qt qt-project.org/doc/qt-4.8/qregexp.html

10voto

Dave Haynes Puntos 999

Esta puede ser una respuesta tonta, ya que puede ser un objetivo de aprendizaje para los estudiantes de posgrado, ¿pero hay alguna razón por la que no estás editando los atributos en QGIS con el uso de la Calculadora de Campos? En versiones anteriores de QGIS (anterior a la 1.7) no era posible editar atributos directamente dentro de QGIS; por lo tanto, era necesario editar archivos .DBF en OpenOffice, etc.

A partir de la versión 1.7 y 1.8 puedes editar datos de atributos directamente en la Calculadora de Campos, con la capacidad de realizar expresiones condicionales. También hay complementos de atributos en Python disponibles, que pueden brindar opciones adicionales para la edición de atributos. Esta puede ser una solución, y/o una opción para tu tutorial.

Como ex estudiante de maestría y ahora empleado universitario, entiendo este problema, el requisito anterior de realizarlo fuera de QGIS, y ahora aprecio la capacidad de realizar todas las ediciones de atributos dentro de QGIS. Estaré encantado de ayudarte más con esto, si así lo deseas.

1 votos

Hola Ryan, sí, esa sería la solución ideal. Es la capacidad de buscar y reemplazar texto en la tabla de atributos, para estandarizar nombres desordenados de OSM, lo que me está impulsando a intentar editar directamente el archivo .dbf. Preferiría editarlo dentro de QGIS. Probaré el complemento de Python Attribute - puede ser la solución ideal. Debería haber dejado más claro en la pregunta que estoy buscando la capacidad de búsqueda/reemplazo con regex.

0 votos

@user1694378 todavía puedes aclarar tu pregunta.

0 votos

Gracias underdark por animarme a hacer eso - refleja mejor lo que realmente quería hacer.

4voto

shsteimer Puntos 8749

Puedes usar Base de LibreOffice para modificar tus archivos dbf.

  1. Abre Base (obtén el menú principal)
  2. Selecciona "Conectar a una base de datos existente" y selecciona el tipo "dBASE".
  3. Selecciona la carpeta con tus archivos dbf.
  4. Selecciona las opciones finales deseadas y haz clic en "Finalizar".
  5. Nombra tu archivo de conexión a la base de datos como desees (por ejemplo, "MisArchivosxBase.odb) y guárdalo en algún lugar. Desde ahora accede a tus archivos de la base de datos haciendo clic en este archivo. ¡ooOoo, genial!
  6. Selecciona "Tablas" en el panel izquierdo, y ahí encontrarás tus archivos de datos (llamados "tablas"). Haz lo que quieras con ellos.

Ahora puedes comenzar a editarlos. Con suerte, eso debería ser suficiente para tus propósitos.

También puedes probar DBF Explorer aunque es solo para Windows. Aun así, tiene opciones de búsqueda y reemplazo.

Introduce aquí la descripción de la imagen

1 votos

Hola R.K. Gracias por la respuesta rápida: parece ser una forma confiable y segura de editar los archivos .dbf. Acabo de probar lo que dijiste y me complace decir que funciona.

0 votos

Bueno saberlo. ¡Buena lección que tienes ahí! :)

0 votos

Pero... acabo de probar lo que dijiste y me complace decir que funciona para celdas individuales. Desafortunadamente, no es una solución al 100% para esta aplicación en particular, porque parece que OOBase no tiene la funcionalidad de búsqueda y reemplazo que se requiere para el tutorial debido a un [error] (lists.freedesktop.org/archives/libreoffice-bugs/2010-Diciembre/‌​er/...). Definitivamente funcionó en celdas individuales: probado. Así que es una solución del 90% para la edición celda por celda, a menos que haya pasado por alto la funcionalidad de búsqueda y reemplazo. ¿Alguna idea de cómo reemplazar todas las entradas "Tesc.*" con "Tesco", por ejemplo?

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X