4 votos

Manejo de umlaut alemán, mientras que la conversión de ArcGIS archivo (*.mxd) de QGIS archivo (*.qgs)

El nombre de la única capa en el proyecto de mapa de ArcGIS myfile.mxd es Mächtigkeit que contiene el alemán diéresis ä. Me enfrento a un mensaje de error cuando se utiliza la secuencia de comandos mxd2qgs.py (descargado de https://github.com/fitnr/mxd2qgs) a pesar de que algunas soluciones se implementan. El guión mxd2qgs_short.py a continuación es, a mi punto de vista, la mayor reducción posible de la secuencia de comandos original, se sigue produciendo el error.

Parece que el error se produce a partir de la interacción de las dos secciones Section mapcanvas y Section legend el uno con el otro. Apagar Section mapcanvas hace que desaparezca el mensaje de error. Yo no logran rastrear la interacción del nombre de la capa con Section mapcanvas. ¿Cómo debo proceder en mxd2qgs_short.py a manejar este problema?

El uso de doc.toprettyxml() se sugiere aquí.

Guión mxd2qgs_short.py:

from xml.dom.minidom import Document
import arcpy

mxd = arcpy.mapping.MapDocument(r"myfile.mxd")
qgs = 'myfile.qgs'

df = arcpy.mapping.ListDataFrames(mxd)[0]
lyrlist = arcpy.mapping.ListLayers(df)
lyr, = lyrlist

doc = Document()
qgis = doc.createElement("qgis")
doc.appendChild(qgis)
legend = doc.createElement("legend")
qgis.appendChild(legend)
unit = doc.createTextNode(df.mapUnits)
units = doc.createElement("units")
units.appendChild(unit)

# Section mapcanvas
mapcanvas = doc.createElement("mapcanvas")
qgis.appendChild(mapcanvas)
mapcanvas.appendChild(units)

# Section legend
legendlayer = doc.createElement("legendlayer")
legendlayer.setAttribute("name",lyr.name.encode('iso-8859-1'))
legend.appendChild(legendlayer)

f = open(qgs,"w")
f.write(doc.toprettyxml())
f.close()

Mensaje de Error:

Traceback (most recent call last):
  File "D:\mxd2qgs_short.py", line 31, in <module>
    f.write(doc.toprettyxml())
  File "C:\Python27\ArcGIS10.5\lib\xml\dom\minidom.py", line 61, in toprettyxml
    return writer.getvalue()
  File "C:\Python27\ArcGIS10.5\lib\StringIO.py", line 271, in getvalue
    self.buf += ''.join(self.buflist)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 1: ordinal not in range(128)

3voto

En los comentarios de Python StringIO.py's getvalue, se observó que si el origen de datos para el IO objeto contenido unicode y 8-cadenas de bits, con alguno de los últimos que contiene 8 bits, pero los caracteres no ASCII (como ä codificado en iso-8859-1), UnicodeDecodeErrors podría resultar. Desde que te has encontrado comentando mapcanvas sección evita el error, y el units es un elemento secundario de ese elemento en su estructura, me gustaría comprobar el valor de df.mapUnits, ya que es más directamente los datos de ArcPy y sospecho que se utiliza cadenas unicode universalmente. Mientras que usted ha codificado el nombre de la capa en un formato de 8 bits de la cadena de caracteres, si df.mapUnits también es una cadena unicode - incluso si no contiene caracteres no-ASCII - el error que estamos viendo podría ocurrir (lo hizo cuando he intentado replicar). Para solucionarlo, si es el caso, usted puede codificar df.mapUnits , así como en la misma codificación, por ejemplo:

unit = doc.createTextNode(df.mapUnits.encode('iso-8859-1'))

En general, usted probablemente querrá asegurarse de que usted aplica su elección de codificación de salida constantemente a través de las cadenas que estás recibiendo de ArcPy (en el ejemplo de código que sólo lyr.name y df.mapUnits, pero si la más amplia secuencia de comandos contiene otros valores de cadena recta de ArcPy, a continuación, codificar esos también).

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