Question

Je construis une tuile serveur Overlay pour Google Maps en C #, et nous avons trouvé quelques différents exemples de code pour le calcul Y de latitude. Après les faire travailler en général, j'ai commencé à remarquer certains cas où les superpositions ne sont pas alignés font correctement. Pour tester cela, j'ai fait un harnais de test pour comparer la conversion Mercator LatToY de Google Map contre les formules I disponibles en ligne. Comme vous pouvez le voir ci-dessous, ils ne correspondent pas dans certains cas.

Cas n ° 1

  

Out zoomée: Le problème est plus   évidente lors d'un zoom sur. Près,   le problème est à peine visible.

Cas n ° 2

  

Point de proximité de haut et bas de   l'affichage des limites: Le problème est pire   au milieu des bornes de visualisation,   et obtient mieux vers les bords.   Ce comportement peut nier le comportement   de cas no 1

Le test:

  

J'ai créé un google maps page   afficher des lignes rouges à l'aide de Google Map   API est construit dans la conversion Mercator,   et superposer cela avec une image en utilisant   le code de référence pour faire Mercator   conversion. Ces conversions sont   représentée par des lignes noires. Comparer   la différence.

Les résultats: Equateur http://www.kayak411.com/Mercator/MercatorComparison%20-%20Equator.png Nord Out http://www.kayak411.com zoomée /Mercator/MercatorComparison%20-%20North%20Zoomed%20Out.png

Découvrez les plus en haut et en bas-la plupart des lignes: Nord Top & Bottom Exemple http://www.kayak411.com/Mercator/MercatorComparison%20-%20North%20Zoomed%20Out%20-%20TopAndBottom.png

Le problème devient visuellement plus, mais numériquement plus faible que vous effectuez un zoom: texte alt http://www.kayak411.com/ Mercator / MercatorComparison% 20-% 20North% 20Zoomed% 20Midway.png

Et il disparaît presque à des niveaux de zoom plus près, quelle que soit l'orientation de l'écran. texte alt http://www.kayak411.com/Mercator /MercatorComparison%20-%20North%20Zoomed%20In.png

Le code:

Google Maps client Code de côté:

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

Serveur code Side:

  

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

Alors, Quiconque a déjà vécu cela? Oserais-je demander, résolu cela? Ou tout simplement une meilleure application C # du projet Mercator conversion de coordonnées?

Merci!

Était-ce utile?

La solution

Merci à tous pour vos suggestions et assistance.

Ce que je finalement découvert que ce n'est pas une formule ou d'un problème technique, je crois qu'il est un problème de méthodologie.

Vous ne pouvez pas définir la zone d'affichage au format Lat / Lng et attendre à le remplir avec les projections de Mercator appropriées. C'est là la distorsion se produit. , Vous avez au lieu de définir la zone de visualisation correcte dans Mercator, Mercator et du projet.

Faire que j'ai pu correspondre correctement avec Google maps.

Autres conseils

Vous pouvez devoir créer plusieurs points le long du Longtitude pour que les points projetés corretly le long de la latitude. Dans vos exemples, vous êtes seulement deux points vraiment projetiez au début et à la fin de la ligne et reliant les deux.

Le problème sera plus évident à l'équateur en raison de la courbure plus importante de la terre. Il sera moins quand zoomé pour la même raison.

Jetez un oeil à http://code.google.com /apis/maps/documentation/overlays.html#Great_Circles

Essayez de créer votre compte Google polylignes avec le paramètre geodsic pour voir si cela fait une différence. Je pense que cela ajoute des points le long de la ligne et les projets eux automatiquement:

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

Je devais lire dans ce que toutes mes mesures de distance ont eu tort dans OpenLayers pour des raisons similaires: http://geographika.co.uk/watch-out-for-openlayer-distances (lien / explications)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top