1 votos

¿Cómo convertir el tamaño de un símbolo en milímetros en uno en metros con PyQGIS?

Recientemente estoy tratando de utilizar la API de PyQGIS para ayudar al mapeo automático en QGIS, y la superposición de algunos símbolos en un mapa que se va a imprimir a una determinada escala no está de acuerdo con los principios de la cartografía.

Para resolver este problema de la forma más sencilla, uno de los dos rasgos se "ocultará" estableciendo el tamaño de su símbolo en 0 si la distancia entre los dos rasgos es menor que la suma del tamaño del símbolo de los dos rasgos en metros convertida a partir del tamaño en milímetros, utilizo directamente Diameter=MaxSymbolSize*CanvasScale/1000 para hacer la conversión, donde Diámetro representa el tamaño en metros, MaxSymbolSize=TestLayer.renderer().symbol().size() y CanvasScale=iface.mapCanvas().scale() . Esto realmente puede manejar el problema de superposición de símbolos correctamente, pero creo que debe haber algunos errores si la región de mapeo es considerablemente grande.

Intento buscar la API relacionada en PyQGIS y encuentro algunas funciones como convertFromMapUnits() , convertMetersToMapUnits() y convertToMapUnits() en QgsRenderContext() clase. Pero la definición de MapUnits y demás en QGIS me resulta un poco confusa y sus respectivos valores de retorno parecen los mismos en diferentes escalas de mapa.

Me pregunto cómo entender correctamente sobre el QgsRendererContext() y cómo convertir el tamaño de un símbolo en milímetros en el de un metro mediante PyQGIS.

1voto

Me parece que construí por error un QgsRenderContext utilizando directamente el objeto QgsRenderContext() y no utilizar su fromMapSettings() eso significa que mi objeto construido no incluye la información de renderización relacionada, lo que hace que el valor de retorno de convertFromMapUnits() y otras funciones parecen no tener sentido.

He aquí un ejemplo:

La proyección de mi proyecto es ESRI:102027 ,y la escala del lienzo del mapa es 1:100000.

La situación equivocada: corre

QgsRenderContext().convertFromMapUnits(200,0)

entonces regresa:

enter image description here

La situación correcta: corre

testRC = QgsRenderContext().fromMapSettings(iface.mapCanvas().mapSettings())
testRC.convertFromMapUnits(200,0)

entonces regresa: enter image description here

El resultado debe ser igual al resultado de usar Diameter=MaxSymbolSize*CanvasScale/1000 como se menciona en esta descripción de la pregunta en mi opinión porque también tengo un intento de medir el tamaño del símbolo directamente utilizar la herramienta de medición como se muestra en la siguiente imagen( nota que se basa en un cálculo cartesiano en lugar de cálculos elipsoidales):

enter image description here

y el símbolo es:

enter image description here

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