Frage

Ich baue eine Kachel-Overlay-Server für Google in C # abbildet, und habe ein paar verschiedenen Code-Beispiele für die Berechnung der Y von Latitude gefunden. Nachdem sie an der Arbeit im Allgemeinen bekommen, begann ich bestimmte Fälle zu bemerken, wo die Auflagen waren nicht richtig Schlange. Um dies zu testen, habe ich einen Test-Harnisch vergleichen Google Map Mercator LatToY Umwandlung gegen die Formeln fand ich online. Wie Sie unten sehen können, sie nicht in bestimmten Fällen entsprechen.

Case # 1

  

Herausgezoomt: Das Problem ist, die meisten   deutlich, wenn gezoomt wird. Nah,   das Problem ist kaum sichtbar.

Case # 2

  

Punkt Nähe zum Top & Bottom of   Betrachten Grenzen: Das Problem ist schlimmer   in der Mitte der Betrachtungs Grenzen,   und wird immer besser zu den Rändern hin.   Dieses Verhalten kann das Verhalten negiert   von Fall # 1

Der Test:

  

Ich habe eine Google Maps-Seite   rote Linien angezeigt werden mit Hilfe der Google Map   API ist in Mercator Umwandlung gebaut,   und überlagern diese mit einem Bild unter Verwendung von   der Referenzcode zu tun Mercator   Umwandlung. Diese Umwandlungen sind   als schwarze Linien dargestellt. Vergleichen Sie   der Unterschied.

Die Ergebnisse: Äquator http://www.kayak411.com/Mercator/MercatorComparison%20-%20Equator.png Nord Herausgezoomt http://www.kayak411.com /Mercator/MercatorComparison%20-%20North%20Zoomed%20Out.png

Schauen Sie sich die meisten Top-und Bottom-meisten Linien: Nord Top & Bottom Beispiel http://www.kayak411.com/Mercator/MercatorComparison%20-%20North%20Zoomed%20Out%20-%20TopAndBottom.png

Das Problem wird optisch größer, aber deren Zahl kleiner ist als Sie vergrößern: alt text http://www.kayak411.com/ Mercator / MercatorComparison% 20-% 20North% 20Zoomed% 20Midway.png

Und alles aber verschwindet bei näheren Zoomstufen, unabhängig von der Bildschirmausrichtung. alt text http://www.kayak411.com/Mercator /MercatorComparison%20-%20North%20Zoomed%20In.png

Der Code:

Google Maps Client Side-Code:

            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));
        }

Server Side-Code:

  

Fliesenschneider:    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);
        }

Also, Wer dies jemals erlebt? Darf ich fragen, entschlossen das? Oder einfach eine bessere C # -Implementierung von Mercator-Projekt hat Koordinatenumwandlung?

Danke!

War es hilfreich?

Lösung

Vielen Dank für Ihre Anregungen und Unterstützung zu erhalten.

Was ich schließlich herausfand, ist, dass es keine Formel oder technisches Problem, ich glaube, es ist eine Methodik Problem.

Sie können den Betrachtungsbereich in Lat / Lng Format definieren, und erwarten, dass es mit den entsprechenden Mercator Projektionen zu füllen. Das ist, wo die Verzerrung passiert. Stattdessen müssen Sie das richtige Sichtfeld in Mercator definieren und projizieren Mercator.

Dadurch, dass ich in der Lage war, richtig zu passen mit Google Maps.

Andere Tipps

Sie müssen möglicherweise an mehreren Punkten entlang der longtitude erstellen, um für die Punkte zu corretly entlang der Breite projiziert werden. In Ihre Beispiele sind Projizieren Sie nur wirklich zwei Punkte am Anfang und das Ende der Linie und verbindet die beiden.

Das Problem wird sich am Äquator deutlicher aufgrund der signifikanteren Krümmung der Erde. Es wird weniger sein, wenn sie in dem gleichen Grunde gezoomt.

Hier finden Sie aktuelle http://code.google.com /apis/maps/documentation/overlays.html#Great_Circles

Versuchen Sie Ihr Google Polylinien mit dem geodsic Parameter zu schaffen, um zu sehen, ob dies einen Unterschied macht. Ich denke, dies fügt Punkte entlang der Linie und Projekte sie automatisch:

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));
}

Ich hatte in dieser zu lesen, wie alle meine Entfernungsmessungen in Openlayers aus ähnlichen Gründen falsch waren: http://geographika.co.uk/watch-out-for-openlayer-distances (mehr Links / Erläuterungen)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top