地图的SA-MP(游戏)坐标的纬度转换不正确(经度正确)

时间:2019-10-08 12:13:07

标签: leaflet latitude-longitude marker coordinate-systems

简介

我正在将游戏坐标转换为地图坐标,我具有自定义的图块设置和地图。

我在传单地图上显示了玩家的车辆(与mapbox相同的问题),x轴的坐标转换正确(在视觉上),而y轴(纬度)不正确。

我尝试过的

我正在尝试将 X 上的 3000转换为-3000 并将 Y上的 3000转换为-3000 的游戏坐标 我认为地图坐标在 X-经度上从 180到-180 Y-纬度

上的 85至-85
  

目前,我正在使用此公式来计算其在地图上的坐标,但是我无法弄清楚我在做什么错。

     
    

我将u设为动态,这样我就可以轻松对其进行测试。

         
      

请注意,返回值将x和y颠倒了,因为这就是传单的样子……

    
  
function getLatLngFromPos(x, y, u = 85) {
    height = 3000; // of the game map
    width = 3000; // of the game map

    return [(y / height) * u, (x / width) * 180];
}

结果(〜表示未计算,但从视觉上猜测):

getLatLngFromPos(1482.47 , -1731.9)

-> [-49.0705,88.9482] 应该是:〜[-71.519235,88.813477]

getLatLngFromPos(1378.4,-1876.25)

-> [-53.16041666666666,82.70400000000001] 应该是:〜[-73.758964,81.958008]

如果您需要磁贴,这是该代码 http://145.239.116.170/app-assets/images/maptiles/sanandreas.{z}.{x}.{y}.png

  

注意: MaxZoom 为“ 4”

结果

错误的结果:

地图上的汽车图标应该转到箭头,并且还有其他信息,例如地图的中心。 (也正在我要删除的X轴上重复)

ScreenShot: (https://i.ibb.co/HNHgRLC/Shared-Screenshot.jpg

假设

我认为这些地图上的Y轴朝着边缘有某种加速度...这是由于默认的传单投影 (https://github.com/ikkentim/SanMap/blob/master/js_src/js/SanMap.js)上还有一个针对Google Maps API的实现,但是Google Maps通过收取费用而成为傻瓜……

我现在假设我将不得不像SanMap实现中那样创建某种投影,如何为Mapbox或Leaflet创建自己的投影?

1 个答案:

答案 0 :(得分:1)

我正在解决相同的问题,这还不是解决方案,但是它可能会让您走上正确的道路。我尝试使用CRS代替传单的类地投影。只需在tileLayer中更改w,h和tileSize即可。左上角也为0,0。

好的,我已经用我的方法找到了解决方案。由于tilesize为256,因此我们的mapsize为256x256。游戏中的坐标从-3000,-3000到3000,3000,这使其成为6000x6000坐标系。您可以通过将地图的大小除以我们拥有的tileize来获得比例,然后再将x除以比例。我们通过将x加128并从y减去-128来校正坐标。之后,我们在返回坐标时切换坐标。

function fixCoords(x,y) {
    x=x/(6000/256);
    y=y/(6000/256);
    x = x+128;
    y = y-128;
    return [y,x];
}
var w = 32768;
var h = 32768;
var mapMinZoom = 1;
var mapMaxZoom = 4;      
var _map = L.map('mapid', {
    maxZoom: mapMaxZoom,
    minZoom: mapMinZoom,
    crs: L.CRS.Simple,
    zoomControl: false,
    attributionControl: false,
    detectRetina: true,
});

var _mapCenter = _map.unproject([w/2, h/2], mapMaxZoom);
_map.setView(_mapCenter, 2);

var _tileLayer = L.tileLayer(
        'http://145.239.116.170/app-assets/images/maptiles/sanandreas.{z}.{x}.{y}.png', {
        minZoom: mapMinZoom, maxZoom: mapMaxZoom,
        bounds: _mapBounds,
        continuousWorld: true,
        noWrap:true,
        tileSize:256,
        crs: L.CRS.Simple,
        detectRetina:false,
}).addTo(_map);

var marker = L.marker([0, 0]).addTo(_map);