c# wpf gis resolution dpi

C#WPF resolución independencia?



gis resolution (3)

Gracias por su pronta respuesta.

Estoy totalmente de acuerdo, pero no quería creerlo desde el principio. Usted ve, tiene que haber un cálculo aproximado de la escala del mapa si el mapa se utiliza para mostrar diferentes capas de datos del mapa (dependiente de la escala). La mayoría de las aplicaciones utilizan un control deslizante con, por ejemplo, 10 niveles de mapas discretos para establecer la "escala".

Tener una escala absoluta no es crucial para la aplicación, sería bueno mostrar una escala indicativa , como 1: 15,000.

Una escala absoluta requeriría una variable adicional monitorPhysicalDPI (inicialmente establecida en 96) que si los usos eligen cambiar daría una escala ligeramente mejor (de nuevo, no es crucial). El tamaño del control de mapa sería:

map.ActualWidth * (96 / monitorPhysicalDPI) * pulgadasPerDIU, pulgadasPerDIU es 1/96

De nuevo, estos son cosméticos ... ¿No sería bueno que Windows supiera las dimensiones del control REAL? (el usuario debería dar información sobre las dimensiones de la pantalla en la configuración del sistema operativo o simplemente instalar el archivo INF del monitor)

Estoy desarrollando un control de mapa en WPF con C #. Estoy usando un control canvas, por ejemplo, 400 x 200, al que se le asigna un área de mapa de, por ejemplo, 2,000mx 1,000m.

La escala del mapa sería: canvas_size_in_meters / real_size_in_meters .

Quiero encontrar el canvas_size_in_meters.

El canvas.ActualWidth da el ancho en DIU (Unidades independientes del dispositivo). Entonces, 400 DIU es 400/96 = 4,17 pulgadas, SIEMPRE que la resolución física de mi monitor sea de 96 ppp.

Sin embargo, al usar una regla, encontré que la resolución física de mi monitor es de 87 ppp. (Hay pocos monitores que REALMENTE tengan 96 dpi físicos)

Esa diferencia DPI (10%) se traduce en una diferencia de + 10% en el ancho de control del mapa real en la pantalla.

¿Cómo mido el tamaño de un control WPF en pulgadas EXACTAMENTE e independientemente de la resolución de pantalla y la configuración de DPI?


¿Cómo mido el tamaño de un control WPF en pulgadas EXACTAMENTE e independientemente de la resolución de pantalla y la configuración de DPI?

Esto no es posible, porque para que funcione, WPF debería conocer la resolución (en términos de DPI) de su monitor. Suena bien en teoría, pero en la práctica Windows no conoce esta información. Esta es la razón por la que Windows siempre asume 96 ppp a ciegas en lugar de ser más inteligente al respecto.

Incluso si hubiera alguna manera de decirlo manualmente, o si su monitor en particular tiene un controlador personalizado que transfiere la información correcta a Windows, esto no funcionará en la computadora de otra persona, por lo que Windows no pasa esta información en a cualquier aplicación

Lo mejor que puedes hacer es dibujar una escala como google maps. Usted sabe que 1 píxel == 1 milla, por lo que puede dibujar una línea de 50 píxeles en su mapa, con una etiqueta que dice "esta línea equivale a 50 millas"


Hay forma de calcular el tamaño del píxel actual en mm o pulgadas. Como se mencionó en las publicaciones anteriores, no es un valor fijo y podría variar según la resolución actual y el tamaño del monitor.

Primero obtén la resolución actual. Supongamos que es 1280x1024 Ahora obtenga el ancho del monitor en mm utilizando la función GetDeviceCaps. Es una función de biblioteca de Windows estándar.

int widthmm = GetDeviceCaps (deviceContext, HORZSIZE); El ancho de mi monitor es de 362 mm

Tamaño de píxel = 362/1280 = 0.282 mm

La precisión de este método depende de la suposición de que el área de visualización cubre exactamente el ancho del monitor.

Entonces, para responder a la pregunta original, el tamaño del lienzo de 400 x 200 píxeles sería (400 * 0.282 / 1000) x (200 * 0.282 / 1000) en metros cuando se muestre en mi monitor.