Pregunta

Estoy construyendo un servidor superposición de mosaicos para los mapas de Google en C #, y han encontrado algunos ejemplos de código diferentes para el cálculo de Y desde la latitud. Después de conseguir que el trabajo en general, empecé a notar ciertos casos en los que los recubrimientos no fueron alineando correctamente. Para probar esto, hice un instrumento de prueba para comparar la conversión de Mercator LatToY de Google Map en contra de las fórmulas que encontré en línea. Como se puede ver a continuación, que no coinciden en ciertos casos.

Caso # 1

  

alejaste: El problema es más   evidente cuando el zoom fuera. De cerca,   el problema es apenas visible.

Caso # 2

  

Punto proximidad a Superior e inferior de   la visualización de los límites: El problema es peor   en medio de los límites de visualización,   y se pone mejor hacia los bordes.   Este comportamiento se puede negar el comportamiento   de Caso # 1

La prueba:

  

He creado una página de google maps   mostrar las líneas rojas utilizando el mapa de Google   API está construido en la conversión de Mercator,   y superponer esto con una imagen utilizando   el código de referencia para hacer Mercator   conversión. Estas conversiones son   representados como líneas negras. Comparar   la diferencia.

Los resultados: ecuador http://www.kayak411.com/Mercator/MercatorComparison%20-%20Equator.png Norte alejaste http://www.kayak411.com /Mercator/MercatorComparison%20-%20North%20Zoomed%20Out.png

Vea las más superiores e inferiores mayoría de las líneas: Norte Top & Bottom Ejemplo http://www.kayak411.com/Mercator/MercatorComparison%20-%20North%20Zoomed%20Out%20-%20TopAndBottom.png

El problema se vuelve visualmente más grande, pero numéricamente inferior medida que se acerca: texto alternativo http://www.kayak411.com/ Mercator / MercatorComparison% 20-% 20North% 20Zoomed% 20Midway.png

Y todo, pero desaparece con niveles de zoom más cerca, independientemente de la orientación de la pantalla. texto alternativo http://www.kayak411.com/Mercator /MercatorComparison%20-%20North%20Zoomed%20In.png

El código:

Google Maps código del lado del cliente:

            var lat = 0;
        for (lat = -80; lat <= 80; lat += 5) {
            map.addOverlay(new GPolyline([new GLatLng(lat, -180), new GLatLng(lat, 0)], "#FF0033", 2));
            map.addOverlay(new GPolyline([new GLatLng(lat, 0), new GLatLng(lat, 180)], "#FF0033", 2));
        }

código del lado del servidor:

  

cortador de baldosas:    http://mapki.com/wiki/Tile_Cutter

     

OpenStreetMap Wiki:    http://wiki.openstreetmap.org/wiki/Mercator

 protected override void ImageOverlay_ComposeImage(ref Bitmap ZipCodeBitMap)
        {
            Graphics LinesGraphic = Graphics.FromImage(ZipCodeBitMap);

            Int32 MapWidth = Convert.ToInt32(Math.Pow(2, zoom) * 255);

            Point Offset =
                Cartographer.Mercator2.toZoomedPixelCoords(North, West, zoom);

            TrimPoint(ref Offset, MapWidth);

            for (Double lat = -80; lat <= 80; lat += 5)
            {
                Point StartPoint = Cartographer.Mercator2.toZoomedPixelCoords(lat, -179, zoom);
                Point EndPoint = Cartographer.Mercator2.toZoomedPixelCoords(lat, -1, zoom);

                TrimPoint(ref StartPoint, MapWidth);
                TrimPoint(ref EndPoint, MapWidth);

                StartPoint.X = StartPoint.X - Offset.X;
                EndPoint.X = EndPoint.X - Offset.X;

                StartPoint.Y = StartPoint.Y - Offset.Y;
                EndPoint.Y = EndPoint.Y - Offset.Y;


                LinesGraphic.DrawLine(new Pen(Color.Black, 2),
                    StartPoint.X,
                    StartPoint.Y,
                    EndPoint.X,
                    EndPoint.Y);

                LinesGraphic.DrawString(
                    lat.ToString(),
                    new Font("Verdana", 10),
                    new SolidBrush(Color.Black),
                    new Point(
                        Convert.ToInt32((width / 3.0) * 2.0),
                        StartPoint.Y));
            }
        }

        protected void TrimPoint(ref Point point, Int32 MapWidth)
        {
            point.X = Math.Max(point.X, 0);
            point.X = Math.Min(point.X, MapWidth - 1);

            point.Y = Math.Max(point.Y, 0);
            point.Y = Math.Min(point.Y, MapWidth - 1);
        }

Por lo tanto, cualquier persona que he experimentado esto? Me atrevo a preguntar, resolver esto? O simplemente tener una mejor aplicación de C # Proyecto Mercator conversión de coordenadas?

Gracias!

¿Fue útil?

Solución

Gracias a todos por sus sugerencias y ayuda.

Lo que finalmente descubrí es que no es una fórmula o problema técnico, creo que es un problema de metodología.

No se puede definir el área de visualización en formato LAT / LNG, y esperar a rellenarlo con las proyecciones de Mercator apropiadas. Ahí es donde ocurre la distorsión. En su lugar, usted tiene que definir el cuadro de visualización correcta en Mercator y proyectar Mercator.

Hacer eso pude coincidir correctamente con los mapas de Google.

Otros consejos

Es posible que tenga que crear varios puntos a lo largo del longtitude para que los puntos sean proyectadas corretly lo largo de la latitud. En los ejemplos que usted está proyectando en realidad sólo dos puntos al principio y al final de la línea y la conexión de los dos.

El problema será más evidente en el ecuador debido a la curvatura más significativa de la tierra. Será menos cuando se acerca por la misma razón.

Para consultar http://code.google.com /apis/maps/documentation/overlays.html#Great_Circles

Trate de crear polilíneas de Google con el parámetro geodsic para ver si esto hace la diferencia. Creo que esto añade puntos a lo largo de la línea y proyectos de forma automática:

var lat = 0;
var polyOptions = {geodesic:true};
for (lat = -80; lat <= 80; lat += 5) {
    map.addOverlay(new GPolyline([new GLatLng(lat, -180), new GLatLng(lat, 0)], "#FF0033", 2, polyOptions));
    map.addOverlay(new GPolyline([new GLatLng(lat, 0), new GLatLng(lat, 180)], "#FF0033", 2, polyOptions));
}

tuve que leer en esto como todos mis mediciones de distancia estaban mal en OpenLayers por razones similares: http://geographika.co.uk/watch-out-for-openlayer-distances (más enlaces / explicaciones)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top