amMap USA地图中的纬度/经度坐标不正确

时间:2015-11-18 04:19:23

标签: javascript amcharts ammap

我正在使用usaLow.js地图构建地图。在map init上,我调用一个返回此数据的json方法:

for ($i = 1;$i=$numrows; $i++) {
     $sql= "INSERT INTO orderItem(order_id,item_linenum,product_id,item_quantity,item_unitprice)
          VALUES(".$_REQUEST["orderNumber"]."$i,'".$_REQUEST["product".$i]."','".$_REQUEST['quantity'.$i]."'," .$_REQUEST['unit'.$i].")";
    print "*" . $sql. "*" . "<br/>";
    $result= mysqli_query($db, $sql) or die("SQL error: " . mysqli_error());
}

通过这些数据,我将其添加到地图的数据提供者(mapData)中:

[{latitude: "40.4258686",longitude: "-86.9080655"}]

这个位置应该在印第安纳州,但这是我看到标记的位置:misplaced_marker

不使用世界地图时是否需要转换纬度/经度坐标?如果是这样,怎么办呢?

编辑:修正了JSON字符串错误

2 个答案:

答案 0 :(得分:7)

您似乎正在使用未经校准的美国地图。 (usaLow.js)此地图因视觉目的而失真,因此与真实的纬度/经度坐标不兼容。

要解决此问题,您需要使用其中一张 校准的地图。选项如下:

选项1:usa2Low.js

它是Mercator校准的美国大陆。除了阿拉斯加和夏威夷之外,标记应该标记为OK,该区域已经移位。

enter image description here

选项2:usaMercatorLow.js

此地图与坐标完全兼容,包括阿拉斯加和夏威夷。但是,它可能看起来不那么有吸引力:

enter image description here

这两张地图都与JavaScript地图捆绑在一起。

答案 1 :(得分:1)

我知道这是一个古老的问题,但我想出了一个可以帮助其他人使用AmCharts.maps.usa2High的解决方案。

如果我知道我正在阿拉斯加或夏威夷绘制一个点,我可以采用真正的纬度/经度并将其缩放/转换为适用于Ammap的纬度/经度。要做到这一点,我只需要在阿拉斯加的Ammap案例中获得2分,安克雷奇和朱诺。使用Ammap开发工具,我能够近似这些位置。这是我如何使它工作。我使用了一个名为Big.js的工具来更准确地进行数学计算 - https://github.com/MikeMcl/big.js/

注意:位置是一个包含我的地址的数组。

                var lat = results[0].geometry.location.lat();
                var lng = results[0].geometry.location.lng();
                if(locations[index].state.toLowerCase() == 'ak' || locations[index].state.toLowerCase() == 'alaska'){
                    //Use 2 points to translate the coordinates

                    //anchorage
                    //normal coords
                    var ax1 = new Big(61.2180556); 
                    var ay1 = new Big(-149.90027780000003);

                    //ammap coords
                    var bx1 = new Big(20.7413);             
                    var by1 = new Big(-115.1221);


                    //juneau
                    //normal coords
                    var ax2 = new Big(58.3019444);
                    var ay2 = new Big(-134.41972220000002);

                    //ammap coords
                    var bx2 = new Big(18.9596);                 
                    var by2 = new Big(-109.7574);

                    //find the scale of Ammaps Alaska vs. actual lat/lng coords
                    var latScale = (bx1.minus(bx2)).div(ax1.minus(ax2));                        
                    var lngScale = (by1.minus(by2)).div(ay1.minus(ay2));

                    //get the new translated point by using the 2 existing points and 
                    lat = bx2.plus(latScale.times((new Big(lat)).minus(ax2)));
                    lng = by2.plus(lngScale.times((new Big(lng)).minus(ay2)));

                }




                if(locations[index].state.toLowerCase() == 'hi' || locations[index].state.toLowerCase() == 'hawaii'){
                    //Use 2 points to translate the coordinates
                    //honolulu
                    //normal coords
                    var ax1 = new Big(21.3069444); 
                    var ay1 = new Big(-157.85833330000003);

                    //ammap coords
                    var bx1 = new Big(24.1081);                 
                    var by1 = new Big(-104.5377);


                    //normal coords
                    var ax2 = new Big(20.7983626);
                    var ay2 = new Big(-156.33192529999997);

                    //ammap coords
                    var bx2 = new Big(23.5082);                 
                    var by2 = new Big(-102.5078);

                    //find the scale of Ammaps Hawaii vs. actual lat/lng coords
                    var latScale = (bx1.minus(bx2)).div(ax1.minus(ax2));                        
                    var lngScale = (by1.minus(by2)).div(ay1.minus(ay2));

                    //get the new translated point by using the 2 existing points and 
                    lat = bx2.plus(latScale.times((new Big(lat)).minus(ax2)));
                    lng = by2.plus(lngScale.times((new Big(lng)).minus(ay2)));

                }