【问题标题】:Incorrect Latitude Conversion from SA-MP(game) coordinates for map (while Longitude is correct)地图的 SA-MP(游戏)坐标的纬度转换不正确(经度正确)
【发布时间】:2019-10-08 12:13:07
【问题描述】:

简介

我正在将游戏坐标转换为地图坐标,我设置了自定义图块并且地图可以正常工作。

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

我尝试过的

我正在尝试将游戏坐标转换为 X 上的 3000 到 -3000 以及 Y 上的 3000 到 -3000 的游戏坐标 我认为地图坐标在 X - Longitude 上的范围是 180 到 -18085 到 -85Y - 纬度

目前我正在使用这个公式来计算它在地图上的坐标,但我无法弄清楚我在这里做错了什么。

我把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];
}

Results(~表示未计算但视觉猜测):

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 轴上重复)

截图: (https://i.ibb.co/HNHgRLC/Shared-Screenshot.jpg)

假设

我认为这些地图上的 Y 轴对边缘有某种加速...这是由于 Leaflet 的默认投影 在 (https://github.com/ikkentim/SanMap/blob/master/js_src/js/SanMap.js) 上也有一个用于 Google Maps API 的实现,但 Google Maps 正在通过收费来实现...

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

【问题讨论】:

标签: leaflet latitude-longitude marker coordinate-systems


【解决方案1】:

我正在解决同样的问题,这还不是解决方案,但它可能会让您走上正轨。我尝试的是使用 CRS 而不是传单类地球投影。只需更改 tileLayer 中的 w、h 和 tileSize 就可以了。 0,0 也会在左上角。

好的,我已经用我的方法找到了解决方案。由于瓦片大小为 256,我们的地图大小为 256x256。游戏内坐标从 -3000,-3000 到 3000,3000,这使其成为 6000x6000 坐标系。您可以通过将地图的大小除以我们拥有的瓦片大小来获得比例,然后我们将 x 除以比例。我们通过将 128 加到 x 并从 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    相关资源
    最近更新 更多