标记座标不正确的传单

时间:2018-11-16 14:04:29

标签: javascript php html leaflet coordinates

我正在使用名为Exile的mod创建名为ArmA 3的游戏的管理员/用户控制面板。流放会将X,Y(以及Z)坐标放置在数据库中。我正在使用PHP捕获这些坐标,并使用leaflet.js在播放器所在的位置放置一个标记。我正在使用自定义图片(15360x15360)。

问题: 可以说我在(6340,7801)(x,y)的位置。标记将从我实际所在的位置移开(请参见下面的imgurs)

(相同的位置) https://imgur.com/a/Nky9Oqf

(传单标记) https://imgur.com/a/jFco4V5

PHP代码+ leaflet.js:

<?php
require_once "application.php";
?>
<html lang="en">
    <head>
        <title>Search</title>
        <link rel="stylesheet" href="leaflet.css">
        <meta charset="UTF-8">
    </head>
    <body>

<?php

if(isset($_GET["q"])) {
    $uid = $_GET["q"];

    $UCP = new UCP("localhost", "root", "root", "testdb", "3306");
    $r = $UCP->getPlayer($uid);
    if($r) {
        $coords = $UCP->getPlayerCoords($uid);
    }
}

?>

<div id="map" style="height: 100%"></div>

<script src="js/leaflet.js"></script>
<script>

var mapMinZoom = 0;
var mapMaxZoom = 4;
var map = L.map('map', {
    minZoom: mapMinZoom,
    maxZoom: mapMaxZoom,
    center: [15360, 15360],
    crs: L.CRS.Simple
});

var w = 15360,
    h = 15360,
    url = 'http://localhost/images/Chernarus_Isles_nogrid.png';

var southWest = map.unproject([0, h], mapMaxZoom);
var northEast = map.unproject([w, 0], mapMaxZoom);
var bounds = new L.LatLngBounds(southWest, northEast);

map.fitBounds(bounds);

L.imageOverlay(url, bounds).addTo(map);

<?php

    if(isset($_GET["q"])) {
        if($r) { ?>
            var pos_x_player = Math.round(<?php echo $coords["pos_x"]; ?>);
            var pos_y_player = Math.round(<?php echo $coords["pos_y"]; ?>);
            var p_loc = map.unproject([pos_y_player, pos_x_player], mapMaxZoom);
            L.marker(p_loc).addTo(map).bindPopup('Player Location');
            <?php

        }
    }

?>
</script>

它成功连接到数据库并获取坐标,但是传单始终不在我实际所在的位置。

任何帮助将不胜感激。如果我错过了任何事情,请告诉我:)

2 个答案:

答案 0 :(得分:0)

欢迎您!

传单地图的unproject第一个参数是一个Point对象,该对象按[horizontal, vertical]的顺序获取坐标:

https://leafletjs.com/reference-1.3.4.html#point-factory

  

期望格式为[x, y]

的数组

因此,标记的位置不正确很可能仅是因为您以错误的顺序传递了坐标:

map.unproject([pos_y_player, pos_x_player], mapMaxZoom)

...应该是:

map.unproject([pos_x_player, pos_y_player], mapMaxZoom)

答案 1 :(得分:0)

点对象是以像素为单位测量的,因此,是的,在这种情况下,源图像和图像必须相同才能获得精确的坐标而无需修改。确定大小差异后,您可以创建一个函数,将原始坐标转换为地图的坐标。