Lat Lon 到 X Y,文字投影缩放级别

Lat Lon to X Y, literal projection zoom level

学习本教程:https://macwright.org/2015/08/31/canvas-animations-on-maps.html

我想将徒步旅行中记录的一系列经纬度坐标映射到 360x180 像素 canvas。

教程给出了这个公式:

var x = longitude + 180;
var y = 90 - latitude;

问题是,所有的点都在彼此重叠,因为(我猜)经纬度小数点在小数点后第 100,000 位之前基本相同。

我如何'zoom'进入或映射到我徒步旅行记录的范围?

5个样本点:

[21.442751, -157.824244],
[21.442773, -157.824226],
[21.442787, -157.824168],
[21.442817, -157.824158],
[21.442886, -157.824173],

你猜对了。由于您的徒步旅行都发生在世界上很小的一部分,因此将其绘制在世界地图上没有帮助。您可以像这样有效地缩放远足坐标并将其居中:

var x = (longitude + 157.82425) * 10000 * 360;

var y = (21.4429 - latitude) * 6000 * 180;

一种策略是将纬度和经度视为笛卡尔坐标,这适用于短距离的十进制度数,但在 1° 纬度远大于 1° 经度的高纬度地区存在缩放问题。在短距离内修复此比例误差并不难(使用纬度的正弦)。

先得到坐标的外接矩形,然后用其他坐标减去左下角,得到最小外接矩形的尺寸。

要使以十进制度表示的坐标适合以像素为单位的框,请缩放值以适合框。

在这种情况下,矩形将是:

  1. 左下角(最小纬度,最小经度):21.442751,-157.824244
  2. 右上(最大纬度,最大经度):21.442886,-157.824158

矩形最多可以使用 4 个不同点的坐标。

这会产生 0.000135 度的差异纬度(高度)和 0.000086 度的差异长度(宽度)。

让比例因子适合 360 x 180 像素的矩形(假设 360 宽 x 180 高)给出:

  1. 身高:180 ÷ 0.000135 = 1,333,333
  2. 宽度:360 ÷ 0.000086 = 4,186,046

假设你想保持结果成比例,两个维度使用相同的因子,否则另一个维度将不适合方框,所以:

  • scaleFactor = 1333333;

要从左下角获取每个点的 x、y 坐标(以像素为单位),请使用:

  • y 坐标:(lat.posA - lat.lowerLeft) * 比例;
  • x 坐标:(lon.posA - lon.lowerLeft) * 比例;

最后要做的是从左上角计算像素坐标,垂直尺寸y向下增加,水平尺寸x向右增加。 x坐标已经OK了,你只需要用180减去y坐标。

因此点变为(注意经纬度转换为 x、y):

  1. (21.442751, -157.824244) => (0, 180)
  2. (21.442773, -157.824226) => (24, 151)
  3. (21.442787, -157.824168) => (101, 132)
  4. (21.442817, -157.824158) => (114, 92)
  5. (21.442886, -157.824173) => (94, 0)

其中 (0,0) 是框的左上角。

.box {
  border: 1px solid red;
  width: 360px;
  height: 180px;
  position: relative;
}

.A {
  position: absolute;
  left: 0px;
  top: 180px;
}
.B {
  position: absolute;
  left: 24px;
  top: 151px;
}
.C {
  position: absolute;
  left: 101px;
  top: 132px;
}
.D {
  position: absolute;
  left: 114px;
  top: 92px;
}
.E {
  position: absolute;
  left: 94px;
  top: 0px;
}
<div class="box">
  <span class="A">1</span>
  <span class="B">2</span>
  <span class="C">3</span>
  <span class="D">4</span>
  <span class="E">5</span>
</div>

额外的工作是使坐标在框中居中,我会把它留给你。