¿Cómo editar fácilmente los datos de atributos utilizando Expresiones regulares?

30

Estoy escribiendo un tutorial para estudiantes de maestría que usa QGIS. Una de las tareas requiere que se modifiquen los datos del atributo (consulte el borrador del tutorial en pdf aquí si está interesado).

La pregunta es cómo hacer que editen los datos del atributo. Sé que esta pregunta se ha hecho antes , y la respuesta solía ser simple: simplemente use LibreOffice calc para modificarla y luego guárdela, asegurándose de que el orden de las filas y los títulos de las columnas se mantengan igual. He usado 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.4.1) Calc codifica 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 le digo a una clase de estudiantes de maestría que hagan esto la próxima semana? He considerado las siguientes opciones:

  1. Use R en su lugar (excelente para mí, pero aterrador para los estudiantes)
  2. Edite el archivo como .csv, y luego únase según la marca de tiempo (bien, pero parece demasiado complejo, y podría introducir más errores en las prácticas de 2 horas)
  3. Use un programa alternativo: he probado Gnumeric y Excel, ninguno de los cuales generó buenos resultados rápidamente.

Para ayudar a responder 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 "puntos.dbf" en LibreOffice - guardar. Vuelva a abrir "points.shp" en QGIS y observe la tabla de atributos codificados. Los otros archivos de forma en la carpeta .zip ya han sido corrompidos por LibreOffice y OpenOffice para ilustrar cómo es el problema para mí.

En resumen, ¿cómo resuelvo mejor este problema?

RobinLovelace
fuente
2
Bienvenido al sitio, me gustaría decir que esta es una pregunta muy bien formulada, y espero que podamos encontrar algunas buenas soluciones. Asumo un poco de pitón está fuera de la cuestión para estos estudiantes, ya que es cómo iba a abordar este problema, en primer lugar ...
sgrieve
13
La edición directa de la parte .DBF de un archivo de forma es demasiado peligrosa para recomendarla para uso rutinario y no debe ser utilizada por principiantes, al menos no si a alguien le importan los datos. Sin embargo, hay disponible una solución más confiable de naturaleza similar: mantener un campo de identificador único en el archivo de forma. Nunca lo edites. En su lugar, mantenga los atributos en una tabla relacionada (en cualquier formato que pueda leer su SIG), unidos en el mismo identificador. Ahora, en gran medida, puede editar la tabla de atributos libremente sin perder la conexión entre forma y atributo, siempre y cuando proteja el campo identificador.
whuber
1
Las soluciones de Python estarían bien, siempre y cuando sean fáciles de implementar y comprender ... En cuanto a mantener un número de identificador que 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 simple que no involucrara archivos adicionales (¡5 por shapefile es bastante IMO!)
RobinLovelace
3
¿Qué quieres decir con 5 por shapefile? Prueba 9! :-) (Los archivos de índice pueden acumularse, dependiendo de qué SIG se esté utilizando). Una vez que necesita más de un archivo relacionado para mantener un conjunto de datos, y los archivos de forma requieren un mínimo de tres, realmente no es ningún problema adicional tirar archivos adicionales. Agregue también un archivo de metadatos mientras lo hace. :-) Y una vez que ha configurado la unión, ¿no se produce automáticamente? (Sin embargo, no veo cómo podría usarse la marca de tiempo para la unión. Eso se usaría en su lugar para un sistema de control de versiones)
Whuber
3
Si tiene alguna inclinación a introducirlos en las bases de datos, spatiaLite tiene una GUI para herramientas de edición de campo y línea de comandos para los datos de OSM. Entonces podría involucrar un poco de SQL y sus estudiantes podrían estar muy por delante de la curva.
Scro

Respuestas:

18

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

Utilice regexp_replace

Esta capacidad fue agregada a la calculadora de campo hace 1 año por Jürgen Fischer (como se ilustra en este informe de error ). Intenté por un tiempo descubrir cómo hacerlo, pero no pude buscar "qgis regex" y otros términos vagos.

Su funcionalidad probablemente se ilustra mejor por la necesidad de estandarizar todos los valores en la columna "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 agregan con frecuencia), se puede utilizar la siguiente función:

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

ingrese la descripción de la imagen aquí

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

Creo que se necesita más documentación (los detalles en el sitio web de QGIS se limitan a unas pocas palabras) 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. Simple: no se necesitan programas adicionales ni complementos
  2. Presenta a los estudiantes el poder de las expresiones regulares, utilizando las funciones (Pythonic?) (El "'" que representa el texto es interesante. Advertencia: "o ningún símbolo falla) y las funciones de la línea de comandos.

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

RobinLovelace
fuente
3
No se preocupe, responder sus propias preguntas no es un problema.
oscuro
Me alegra que hayas encontrado algo que te ayude. Gracias por compartir, sé que usaré esto.
Ryan Garnett
1
Pregunté a los desarrolladores de QGIS, es Qt regex qt-project.org/doc/qt-4.8/qregexp.html
wildintellect
9

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á editando los atributos en QGIS con el uso de la Calculadora de campo? En versiones anteriores de QGIS (pre 1.7), los atributos de edición directamente dentro de QGIS no eran posibles; de ahí la necesidad de editar archivos .DBF en OpenOffice, etc.

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

Como anterior estudiante de maestría y ahora empleado de la universidad, 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 ayudarlo con esto más, si lo desea.

Ryan Garnett
fuente
1
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 OSM desordenados, lo que me empuja a intentar editar el archivo .dbf directamente. Prefiero editarlo dentro de QGIS. Probaré el complemento de Python Attribute; puede ser la solución ideal. Debería haber hecho más claro el hecho de que estoy buscando la capacidad de búsqueda / reemplazo de expresiones regulares en la pregunta.
RobinLovelace
@ user1694378 aún puede aclarar su pregunta.
oscuro
Gracias a Underdark por empujarme a hacer eso, refleja mejor lo que realmente quería hacer.
RobinLovelace
3

Puede usar la Base de LibreOffice para modificar sus archivos dbf .

  1. Base abierta (obtener el menú principal)
  2. Seleccione "Conectarse a una base de datos existente" y seleccione el tipo "dBASE".
  3. Seleccione la carpeta con sus archivos dbf.
  4. Seleccione las opciones finales que desee y "Finalizar".
  5. Asigne un nombre al archivo de conexión de la base de datos como desee (por ejemplo, "MyxBasefiles.odb) y guárdelo en algún lugar. En adelante, acceda a los archivos de la base de datos haciendo clic en este archivo. OoOoo, Nice.
  6. Seleccione "Tablas" en el panel izquierdo, y allí están sus archivos de datos (llamados "tablas"). Meterse con ellos.

Ahora puede comenzar a editarlos. Esperemos que eso sea lo suficientemente bueno para sus propósitos.

También puedes probar DBF Explorer, aunque solo es Windows. Sin embargo, tiene búsqueda y reemplazo.

ingrese la descripción de la imagen aquí

RK
fuente
1
Hola RK Gracias por la pronta respuesta: parece ser una forma confiable y segura de editar los archivos .dbf. Acabo de probar lo que dijiste y me complace decir que funciona.
RobinLovelace
Bueno saber. Buena lección que tienes allí. :)
RK
Pero ... acabo de probar lo que dijiste y me complace decir que funciona para células 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 de reemplazo que se requiere para el tutorial debido a un [error] ( lists.freedesktop.org/archives/libreoffice-bugs/2010 -Diciembre / ... ). Sin embargo, definitivamente funcionó en células individuales: probado. Entonces, esa es una solución del 90% para la edición celda por celda, a menos que haya perdido la funcionalidad de búsqueda y reemplazo. ¿Alguna idea de cómo reemplazar todas las entradas "Tesc. *" Con "Tesco", por ejemplo?
RobinLovelace
Mejor enlace para OO Base bug: bugs.freedesktop.org/show_bug.cgi?id=32506
RobinLovelace
Actualicé mi respuesta.
RK