سؤال

لدي Lat/Long قيمة نيويورك, NY;40.7560540,-73.9869510 و صورة مسطحة من الأرض ، 1000px × 446px.

وأود أن تكون قادرة على تحويل باستخدام جافا سكريبت, Lat/Long X,Y إحداثيات نقطة من شأنه أن يعكس الموقع.

حيث X,Y تنسيق شكل الزاوية العلوية اليسرى من الصورة ؛ 289, 111

الأشياء ملاحظة:

  1. لا تقلق بشأن قضايا ما الإسقاط إلى استخدام تجعل الخاصة بك الافتراض أو الذهاب مع ما تعرفه قد عمل
  2. X,Y يمكن أن يكون أي شكل زاوية الصورة
  3. نقاط المكافأة نفس الحل في PHP (ولكن أنا حقا بحاجة JS)
هل كانت مفيدة؟

المحلول

الأساسية وظيفة التحويل في شبيبة ليكون:

MAP_WIDTH = 1000;
MAP_HEIGHT = 446;

function convert(lat, lon){
    var y = ((-1 * lat) + 90) * (MAP_HEIGHT / 180);
    var x = (lon + 180) * (MAP_WIDTH / 360);
    return {x:x,y:y};
}

هذا سيعود عدد بكسل من أعلى اليسار.هذه الوظيفة يفترض التالية:

  1. أن الصورة يتم محاذاة بشكل صحيح مع الزاوية اليسرى العليا (0,0) مواءمة مع 90* الشمال 180* الغربية.
  2. أن coords وقعت مع N يجري -S يجري +, W يجري ولا يجري +

نصائح أخرى

الإسقاط استخدام سيغير كل شيء ، ولكن هذا العمل افتراض إسقاط مركاتور:

<html>
<head>
<script language="Javascript">
var dot_size = 3;
var longitude_shift = 55;   // number of pixels your map's prime meridian is off-center.
var x_pos = 54;
var y_pos = 19;
var map_width = 430;
var map_height = 332;
var half_dot = Math.floor(dot_size / 2);
function draw_point(x, y) {
    dot = '<div style="position:absolute;width:' + dot_size + 'px;height:' + dot_size + 'px;top:' + y + 'px;left:' + x + 'px;background:#00ff00"></div>';
    document.body.innerHTML += dot;
}
function plot_point(lat, lng) {
    // Mercator projection

    // longitude: just scale and shift
    x = (map_width * (180 + lng) / 360) % map_width + longitude_shift;

    // latitude: using the Mercator projection
    lat = lat * Math.PI / 180;  // convert from degrees to radians
    y = Math.log(Math.tan((lat/2) + (Math.PI/4)));  // do the Mercator projection (w/ equator of 2pi units)
    y = (map_height / 2) - (map_width * y / (2 * Math.PI)) + y_pos;   // fit it to our map

    x -= x_pos;
    y -= y_pos;

    draw_point(x - half_dot, y - half_dot);
}
</script>
</head>
<body onload="plot_point(40.756, -73.986)">
    <!-- image found at http://www.math.ubc.ca/~israel/m103/mercator.png -->
    <img src="mercator.png" style="position:absolute;top:0px;left:0px">
</body>
</html>

هناك مكتبة جافا سكريبت ، PROJ4JS, هذا يسمح لك أن تفعل التحولات بين مختلف التوقعات.

إذا كان لديك صورة الأرض كلها, الإسقاط دائما لا يهم.ولكن ربما أنا فقط لا أفهم سؤالك.

لقد كتبت الوظيفة التي يعمل ميركاتور الخرائط.خصوصا إذا كانت الصورة لا تغطي العالم كله ، يعني أنه يعمل أيضا مع اقتصاص الخرائط: https://stackoverflow.com/a/10401734/730823

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