سؤال

في فتح مكتبة الطبقات، وفيما يلي الطريقة المستخدمة لتحويل شارك تنسيق الشاشة لخطوط الطول والعرض. أنا لست قادرا على معرفة منطق هذا الأسلوب بتغليف؟

و

getLatLonFromPoint: function (point) {
    var center = this.getCenter();
    //map center lat/lon
    var res  = this.getResolution(); 
    //pre defined by the user. Represents the change in lat long per screen unit at the given zoom level
    var size = this.getSize(); 
    //this is the width and height of the div in which the map has to be displayed
    var delta_x = point.x - (size.w / 2);
    var delta_y = point.y - (size.h / 2);
    return new OpenLayers.LatLon(
        center.lat - delta_y * res,
        center.lon + delta_x * res );
   }

و

ويمكن للشخص يرجى تقديم بعض المؤشرات؟

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

المحلول

وظيفة تحسب على خطوط الطول والعرض لنقطة محددة على أساس القرار الحالي من الخريطة، وخطوط الطول والعرض من نقطة وسط الخريطة الحالية، وبعد أن النقطة التي تم اختيارها من وسط خريطة.

var center = this.getCenter();
//map center lat/lon
var res  = this.getResolution(); 
//pre defined by the user. Represents the change in lat long ...
var size = this.getSize(); 

وبت أعلاه من التعليمات البرمجية يجمع المعلومات اللازمة لحساب: إن النقطة المركزية للعرض الخريطة الحالية (والتي سوف تعطينا خطوط الطول / العرض على نقطة الوسط)، ودقة الخريطة الحالية، وخريطة الحجم الحالي على الشاشة المستخدمين (الذي يتم تنفيذه عن طريق حجم الشاشة، الخ).

وبعد ذلك حساب غني عن مثل هذا:

    //this is the width and height of the div in which the map has to be displayed
    var delta_x = point.x - (size.w / 2);
    var delta_y = point.y - (size.h / 2);

واستقل أولا س المشارك أورد (بالبكسل) وطرح عرض الخريطة (بالبكسل). هذا يعطينا جديد س المشارك أورد فيها 0 هو بكسل مركز الخريطة. الآن يجب أن يكون دلتا س قيمة بكسل تتراوح بين - (size.w / 2) ل+ (size.w / 2). ثم نفعل نفس الشيء لذ المشارك أورد. لذا دلتا x و دلتا ذ الآن ديكارت تنسق مع الأصل في مركز الخريطة.

    return new OpenLayers.LatLon(
        center.lat - delta_y * res,
        center.lon + delta_x * res );

ونحن بحاجة إلى تحويل دلتا x و دلتا-ي من بكسل لخطوط الطول / العرض. أولا ضربنا دلتا x و دلتا سنويا بحلول القرار الحالي. هذا يعطينا الحجم الصحيح ولكن لا أصل الصحيح. مضيفا centre.lat وcentre.lon adusts ليعطينا خطوط الطول / العرض على أساس خريطة المعروضة حاليا.

وأخيرا دعوة "OpenLayers.LatLon الجديد 'فقط يلتف الحسابات المذكورة أعلاه في كائن LatLon، بحيث يمكن إرجاعها من الدالة ككائن LatLon.

وتحرير: عند العمل مع بكسل، أي بزيادة في العاشر المشارك أورد عادة يعني "نقل حق"، وزيادة في ذ ك-أورد عادة يعني "نقل ما يصل. على الخريطة، عند زيادة الطول، وعادة ما كنت 'التحرك الصحيح ". ومع ذلك خط العرض هو رأسا على عقب. عند زيادة العرض، الذي عادة "تنزل" على الخريطة.

وبالتالي يعمل خط العرض في الاتجاه المعاكس لذ مخطط المشارك أورد العادي على الشاشة. وبالتالي في الحساب النهائي يتم استخدام ناقص لcentre.lat لكن زائد لcentre.lon.

نصائح أخرى

وأنا ترتيبها التعليقات الموجودة، إضافة بعض أكثر وإضافة بعض المساحة البيضاء. نأمل، ستجد هذا أكثر وضوحا.

getLatLonFromPoint: function (point) {
    // point is the x and y screen coordinate

    // map center lat/lon
    var center = this.getCenter();

    // pre defined by the user. Represents the change in lat long per screen unit at the given zoom level
    var res  = this.getResolution(); 

    // this is the width and height of the screen (div) in which the map has to be displayed
    var size = this.getSize(); 

    // this is the distance of the point from the center of the screen (div)
    var delta_x = point.x - (size.w / 2);
    var delta_y = point.y - (size.h / 2);

    // return the latitude and longitude
    //   these are calculated from the center lat/lon using the 
    //   screen distances which are scaled (multiplied) by the resolution
    return new OpenLayers.LatLon(
        center.lat - delta_y * res,
        center.lon + delta_x * res );
   }

وجرب هذا:

map.events.register("mousemove", map, function(e) { 
    var position = this.events.getMousePosition(e);
    var p = map.getLonLatFromPixel(new OpenLayers.Pixel(position.x, position.y));
    // your longitude value = p.lon;
    // your latitude value = p.lat;
});
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top