我正在尝试计算比例因子,以便在伪地图中粗略地放置一些点。地图以某个(纬度,长度)点为中心。我想要放置的点位于设定距离$('tr span').click(function(){
$(this).closest("tr").find("span").css('color', '#838282');
});
(半径)的区域内,并且还以纬度和经度表示。
现在我的问题是,为了让我能够在我的“地图”(一个固定维度的SVG元素)中缩放这些点的位置,我需要一个“比例因子”。例如,如果SVG元素表示半径为5km的区域,而我的SVG是500px的正方形,那么如何使用某些精度放置这些点? 一些精度就足够了,因为完美球形行星的假设足以实现我的目标。
我提出这个问题的原因与所解释的事实here有关。根据我的理解,这意味着在纬度和经度上表示的两点之间的小数差异在地球的不同区域有所不同。
因此,如果我想知道d
以便知道他们的纬度和经度,我该如何计算?
我现在所拥有的只是这个公式来计算两点之间的距离,知道它们的纬度和经度:
how many pixels does 5km represent in this area of the globe
我可以改变这个来告诉我小数差(即纬度方面),给定一个点和一个距离吗?
答案 0 :(得分:0)
地理地图是表示伪球体的2D平面。 要获得这样的地图,您需要应用投影。 周围使用了许多投影,但Google地图和开放街道地图使用Mercator投影。
在此投影中,纬度更容易转换。假设您的2D地图中有 W 像素。您希望经度-180°为X = 0,经度180°为X = W。
function lng2x(lng, W) {
lng = ((lng + 180) % 360) - 180;
return W * lng / 360;
}
现在你想得到Lat = 90的Y = 0和Lat = -90的Y = H. 这种情况不是线性的,功能稍微复杂一些:
function lat2y(lat, H) {
// The deformation is very intense at the poles.
// Mercator projection is suitable only for lat in [-85, 85].
lat = Math.min(lat, 85);
lat = Math.max(lat, -85);
var y = lat * Math.PI / 180;
return H * (
1 - Math.log(
Math.tan(y) + 1 / Math.cos(y)
) / Math.PI
) / 2;
};