كيفية تحويل إحداثيات طبقة المتجه إلى خطوط الطول وخطوط الطول في OpenLayers

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

سؤال

أنا في حيرة من أمري. لدي نقطة:

x= -12669114.702301
y= 5561132.6760608

حصلت على رسم مربع على طبقة متجه مع وحدة التحكم في السحب.

تبدو الأرقام ... erm ... رائعة ، لكن يبدو أنها تعمل ، لأنه إذا رسمت مربعًا لاحقًا بنفس النقاط ، فهي في نفس الموقف ، لذلك أعتقد أنها على حق.

المشكلة هي عندما أحاول تحويل هذه النقطة إلى خطوط الطول والعرض.

أنا استخدم:

map.getLonLatFromPixel(pointToPixel(points[0]));

عندما تكون النقاط [0] نقطة هندسية ، وتأخذ وظيفة PointTopixel أي نقطة وتحولها إلى بكسل (لأن GetLonlatfrompixel يحتاج إلى بكسل). يفعل ذلك ببساطة عن طريق أخذ النقطة X ، وجعله وحدات البكسل X ، وهلم جرا.

خطوط الطول والعرض الذي أحصل عليه هو في ترتيب:

lat: -54402718463.864
lng: -18771380.353223

هذا خطأ بوضوح للغاية. لقد تركت في حيرة من أمري. أحاول إسقاط هذا الكائن ، باستخدام:

.transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());

لكنني لا أحصل عليها حقًا وأنا متأكد من أنني فعلت ذلك بشكل غير صحيح ، على أي حال.

الكود الخاص بي هنا: http://pastie.org/909644

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

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

المحلول

وفقًا للرمز الخاص بك ، فإن الإسقاط الذي تستخدمه هو EPSG: 900913 ، وهو الإسقاط الذي تستخدمه Google. وحدات هذا الإسقاط هي عدادات ، والقيم التي تحصل عليها لهذه النقطة صحيحة تمامًا:

x= -12669114.702301 (longitude)
y= 5561132.6760608 (latitude)

هذه القيم ليست وحدات بيكسل ولكنها إحداثيات في إسقاط EPSG: 900913 ، وهي صحيحة (طالما من المفترض أن تكون فيها أيداهو, ، إذا لم يكن هناك شيء خاطئ في مكان آخر)

للتحقق من ذلك ، يمكنك الذهاب إلى http://proj4js.org/ وتحويل إحداثياتك من EPSG: 900913 إلى WGS84 (LAT/LON) ، والتي ستمنحك:

x = -113.8085937334033 (longitude)
y = 44.615123313472 (latitude)

هذه هي القيم التي ربما تتوقعها. إذا كنت ترغب في الحصول عليها من الإحداثيات النقطة ، فاستخدم شيئًا مثل:

point.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326"));

سيؤدي ذلك إلى تحويل الإحداثيات من إسقاط Google إلى WGS84 (خط العرض / خط الطول).

نصائح أخرى

بقدر ما أتذكر ، فإن Box Handler ينفذ بشكل مختلف عن المعالجات الآخرين في OL. كان علينا تنفيذ معالج خاص يعيد هندسة مع إحداثيات LON/LAT بدلاً من ذلك مع إحداثيات البكسل:

Legato.Handler.Box = OpenLayers.Class(OpenLayers.Handler.Box, {
  endBox : function(end) {
    var result;
    if (Math.abs(this.dragHandler.start.x - end.x) > 5
        || Math.abs(this.dragHandler.start.y - end.y) > 5) {
      var start = this.dragHandler.start;
      var top = Math.min(start.y, end.y);
      var bottom = Math.max(start.y, end.y);
      var left = Math.min(start.x, end.x);
      var right = Math.max(start.x, end.x);

      var lowerLeftLonLat = this.map.getLonLatFromPixel(new OpenLayers.Pixel(
          left, bottom));
      var upperRightLonLat = this.map.getLonLatFromPixel(new OpenLayers.Pixel(
          right, top));
      var bounds = new OpenLayers.Bounds(lowerLeftLonLat.lon,
          lowerLeftLonLat.lat, upperRightLonLat.lon, upperRightLonLat.lat);
      result = bounds.toGeometry();
    } else {
      var xy = this.dragHandler.start.clone();
      var lonLat = this.map.getLonLatFromPixel(xy);
      result = new OpenLayers.Geometry.Point(lonLat.lon, lonLat.lat);
    }
    this.removeBox();
    this.callback("done", [ result ]);
  },

  CLASS_NAME :"Legato.Handler.Box"
});
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top