كيفية تحويل إحداثيات طبقة المتجه إلى خطوط الطول وخطوط الطول في OpenLayers
-
25-09-2019 - |
سؤال
أنا في حيرة من أمري. لدي نقطة:
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"
});