صيغ إسقاط Mercator الشائعة لخرائط Google لا تعمل بشكل صحيح

StackOverflow https://stackoverflow.com/questions/2656580

سؤال

أقوم بإنشاء خادم تراكب للبلاط لخرائط Google في C#، ووجدت بعض أمثلة رمز مختلفة لحساب Y من Latitude. بعد حملهم على العمل بشكل عام ، بدأت ألاحظ بعض الحالات التي لم تكن فيها التراكبات تصطف بشكل صحيح. لاختبار هذا ، قمت بإجراء اختبار اختبار لمقارنة تحويل Mercator Lattoy من Google Map مقابل الصيغ التي وجدتها عبر الإنترنت. كما ترون أدناه ، فهي لا تتطابق في بعض الحالات.

حالة 1

تكبير: المشكلة أكثر وضوحًا عند التكبير. عن قرب ، المشكلة بالكاد مرئية.

الحالة رقم 2

القرب من حدود المشاهدة العلوية والسفلية: المشكلة أسوأ في منتصف حدود المشاهدة ، وتتحسن نحو الحواف. هذا السلوك يمكن أن ينفي سلوك الحالة رقم 1

الاختبار:

لقد قمت بإنشاء صفحة خرائط Google لعرض خطوط حمراء باستخدام تحويل Mercator المدمج في Mercator من Google MAP ، وتراكب هذا مع صورة باستخدام رمز المرجع لإجراء تحويل Mercator. يتم تمثيل هذه التحويلات كخطوط سوداء. قارن الفرق.

النتائج:خط الاستواء http://www.kayak411.com/mercator/mercatorcomparison٪20-٪20equator.png تم تكبير الشمال إلى http://www.kayak411.com/mercator/mercatorcomparison٪20-٪20north٪20zoomed٪20out.png

تحقق من الخطوط الأعلى وأكثرها الأسفل:مثال على أعلى وأسفل الشمال http://www.kayak411.com/mercator/mercatorcomparison٪20-٪20north٪20zoomed٪20out٪20-٪20topandbottom.png

تصبح المشكلة أكبر بصريًا ولكنها أصغر عدديًا أثناء تكبيرك:alt text http://www.kayak411.com/mercator/mercatorcomparison٪20-٪20north٪20zoomed٪20midway.png

وكل ذلك يختفي عند مستويات التكبير الوثيقة ، بغض النظر عن اتجاه الشاشة.alt text http://www.kayak411.com/mercator/mercatorcomparison٪20-٪20north٪20zoomed٪20in.png

الرمز:

رمز جانبي العميل خرائط Google:

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

رمز جانب الخادم:

قطع البلاط : 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);
        }

لذلك ، أي شخص من قبل من قبل هذا؟ أجرؤ على طلب ، حل هذا؟ أو ببساطة لديك تطبيق C# أفضل لتحويل تنسيق مشروع Mercator؟

شكرًا!

هل كانت مفيدة؟

المحلول

شكرا لكم جميعا على اقتراحاتك ومساعدتك.

ما اكتشفته في النهاية هو أنها ليست صيغة أو مشكلة فنية ، وأعتقد أنها مشكلة منهجية.

لا يمكنك تحديد منطقة المشاهدة بتنسيق LAT/LNG ، وتتوقع أن تملأها بتوقعات Mercator المناسبة. هذا هو المكان الذي يحدث فيه التشويه. بدلاً من ذلك ، يجب عليك تحديد مربع العرض الصحيح في Mercator ، ومشروع Mercator.

عند القيام بذلك ، تمكنت من مطابقة خرائط Google بشكل صحيح.

نصائح أخرى

قد تضطر إلى إنشاء عدة نقاط على طول الطول حتى يتم عرض النقاط بشكل واضح على طول خط العرض. في الأمثلة الخاصة بك ، تقوم فقط بإسقاط نقطتين في البداية ونهاية الخط وتوصيل الاثنين.

ستكون المشكلة أكثر وضوحًا في خط الاستواء بسبب انحناء الأرض الأكثر أهمية. سيكون أقل عند التكبير لنفس السبب.

القي نظرة على http://code.google.com/apis/maps/documentation/overlays.html#great_curcles

حاول إنشاء google polylines الخاص بك باستخدام المعلمة الجيودسية لمعرفة ما إذا كان هذا يحدث فرقًا. أعتقد أن هذا يضيف نقاطًا على طول الخط ويعرضها تلقائيًا:

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

اضطررت إلى قراءة هذا لأن جميع قياسات المسافة الخاصة بي كانت خاطئة في OpenLayers لأسباب مماثلة: http://geographika.co.uk/watch-out-for-openlayer-distances (المزيد من الروابط/التفسيرات)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top