formules de projection commune Mercator pour Google Maps ne fonctionne pas correctement
-
27-09-2019 - |
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!
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)