Javascript纬度和经度到自定义地图上的像素

时间:2018-12-20 10:07:15

标签: javascript html css maps

我有一个由商店的坐标(纬度,经度)描述的商店列表,我需要在自定义世界地图上将它们解析为标记(具有CSS绝对位置)。 Google Map和其他库(jVector map和类似库)不是解决方案。我发现一些公式可以将lat / lon转换为像素的左/右值以用于标记,但是转换似乎不准确。

您可以看到a demo clicking here。例如,红色子弹应该是罗马,绿色子弹应该是里约热内卢。两者都不在应有的位置,并且标记之间的“错误偏移量”并不总是相同的(换句话说:添加translateX(-XXpx)并不能解决所有问题)。

显然我缺少一些东西,而且我很确定我应该以我不知道和不理解的方式设置地图图像。有人可以帮忙吗?

谢谢,这是演示的相关代码:

<div id="map" style="width: 800px;margin:100px;auto;position:relative;background-color:#dedede;">
    <img src="map.svg" style="width:100%;">
</div>
<script>
    var map = document.getElementById('map');
    var stores = [
        {
            "name": "Rome",
            "n": 10,
            "lat": 41.9097306,
            "lng": 12.2558141,
            "fill": "red"
        },
        {
            "name": "Rio di Janeiro",
            "n": 5,
            "lat": -22.9138851,
            "lng": -43.7261746,
            "fill": "green"
        }
    ];
    stores.forEach(element => {
        var pos = coordToPixel(element.lat,element.lng);
        var marker = document.createElement('div');
        marker.className = 'marker';
        marker.style.left = pos.x+'px';
        marker.style.top = pos.y+'px';
        marker.style.backgroundColor = element.fill;
        map.appendChild(marker);
    });
    function coordToPixel(lat,lng)
    {
        var MAP_WIDTH = 800,
            MAP_HEIGHT = 444
            ;
        var x = ((lng+180)*MAP_WIDTH/360),
            y = ((90-lat)*MAP_HEIGHT/180)
            ;
        return {x,y}
    }
</script>

2 个答案:

答案 0 :(得分:0)

您的观点不正确,因为您的公式未考虑地球不是平坦的平面。

假设您使用的是mercador投影(对我来说就像这样)。

详细的answer

中的伪代码
latitude    = 41.9097306;
longitude   = 12.2558141;

mapWidth    = 800;
mapHeight   = 444;

// get x value
x = (longitude+180)*(mapWidth/360)

// convert from degrees to radians
latRad = latitude*PI/180;

// get y value
mercN = ln(tan((PI/4)+(latRad/2)));
y     = (mapHeight/2)-(mapWidth*mercN/(2*PI));

答案 1 :(得分:0)

因此,对于所有在此问题上苦苦挣扎的人来说,问题在于我只是忽略了地图图像的大小和绘制方式。使用有效的墨卡托投影图可以修复所有here are some examples

感谢大家帮助我理解这一点!