我正在将游戏坐标转换为地图坐标,我具有自定义的图块设置和地图。
我在传单地图上显示了玩家的车辆(与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创建自己的投影?
答案 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);