Dönüştürmek Lat / Uzun Ürünler X / Y koordinasyonunu

5 Cevap php

New York, NY Lat / Long değerine sahiptir; 40.7560540, -73,9869510 ve toprak, 1000px × 446px düz bir görüntü.

Ben noktası konumunu yansıtmak nerede Y koordinatı, bir X için Javascript, Lat / Long kullanarak, dönüştürmek mümkün olmak istiyorum.

Yani X, Y, görüntünün sol üst köşesinde oluşturacak koordine olacaktı; 289, 111

Unutulmaması gereken:

  1. don't worry about issues of what projection to use, make your own assumption or go with what you know might work
  2. X, Y görüntünün herhangi bir köşe meydana edilebilir
  3. Bonus points for the same solution in PHP (but I really need the JS)

5 Cevap

Js temel dönüştürme fonksiyonu olacaktır:

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

This will return the number of pixels from upper left. This function assumes the following:

  1. That your image is properly aligned with the upper left corner (0,0) aligning with 90* North by 180* West.
  2. Lütfen coords N varlık ile imzalanan olduğunu -, S olmak +, W varlık - ve E olmak +

Kullandığınız projeksiyon her şeyi değiştirmek için gidiyor, ama bu bir Mercator projeksiyon varsayarak çalışacaktır:

<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>

İyi bir JavaScript kütüphanesi var, PROJ4JS, bu farklı projeksiyonlar arasındaki dönüşümleri yapmanızı sağlar.

Eğer bütün dünyanın bir resim varsa, projeksiyon her zaman fark eder. Ama belki ben sadece soruyu anlamadım.

Ben Mercator haritaları için çalışan bir fonksiyon yazdım. Görüntü tüm dünyayı kapsamaz, özellikle de kırpılmış haritalarla çalışır gelir: http://stackoverflow.com/a/10401734/730823