仅使用 OSM 地图中心坐标和缩放因子计算区域边界
Calculate area boundaries with only coordinates of the OSM map centre and the zoom factor
我正在使用 MapSCII(由 rastapasta 开发)用于一个使用 python 和 nodejs 的项目。我需要根据它们在 MapSCII 输出中的位置来渲染一些对象。 MapSCII 使用 OSM 切片图层生成 ASCII 地图。我只知道地图中心的坐标,缩放级别以及ASCII地图的rows/columns个数。
关于如何计算边界(左上角和右下角),以便我可以将局部坐标系映射到 ACSII 数据,您有什么提示吗?
以这些变量为例:
def calculate_boundaries(lat, lng, zoom, width, height) -> tuple:
...
lat = 51.5252178
lng = -0.0925642
zoom = 17
width = 80
height = 24
upper_left, lower_right = calculate_boundaries(lat, lng, zoom, width, height)
我偶然发现了 this wiki entry,但这似乎没有帮助,因为我不使用图块编号而是使用 latitude/longitude。
// 编辑
这甚至可行吗?或者更容易记下来,在每个缩放级别上移动 2D MapSCII 数组时有多少 lat/lng 变化?
让我们考虑以像素为单位的宽度和高度。
每像素米数的计算 (m/px)
01(一)像素表示的距离(S)由下式给出:
S=C*余弦(y)/2^(z+8)
其中:
C是地球赤道的周长;
z 是缩放级别;
y 是你想要获得比例的纬度。
来源:https://wiki.openstreetmap.org/wiki/Pt:Zoom_levels
将度数转换为弧度时出错。所以我导入了 pi 和转换。
from math import cos, pi
def calculate_boundaries(lat, lng, zoom, width, height): # -> tuple:
upper_left, lower_right = {}, {}
C = 40075 # km - Equator distance around the world
y = pi * lat / 180 # convert latitude degree to radian
S = C * cos(y) / 2 ** (zoom + 8) # km distance of 1 px - https://wiki.openstreetmap.org/wiki/Pt:Zoom_levels
S_deg = S * cos(y) / 100 # convert km (distance of 1 px) to degrees (coordinates)
upper_left['lat'] = lat + height / 2 * S_deg
upper_left['lng'] = lng - width / 2 * S_deg
lower_right['lat'] = lat - height / 2 * S_deg
lower_right['lng'] = lng + width / 2 * S_deg
return upper_left, lower_right
# main
lat = 51.5252178
lng = -0.0925642
zoom = 17 # zoom
width = 80 # considered as pixels
height = 24
upper_left, lower_right = calculate_boundaries(lat, lng, zoom, width, height)
print(upper_left, lower_right)
我正在使用 MapSCII(由 rastapasta 开发)用于一个使用 python 和 nodejs 的项目。我需要根据它们在 MapSCII 输出中的位置来渲染一些对象。 MapSCII 使用 OSM 切片图层生成 ASCII 地图。我只知道地图中心的坐标,缩放级别以及ASCII地图的rows/columns个数。
关于如何计算边界(左上角和右下角),以便我可以将局部坐标系映射到 ACSII 数据,您有什么提示吗?
以这些变量为例:
def calculate_boundaries(lat, lng, zoom, width, height) -> tuple:
...
lat = 51.5252178
lng = -0.0925642
zoom = 17
width = 80
height = 24
upper_left, lower_right = calculate_boundaries(lat, lng, zoom, width, height)
我偶然发现了 this wiki entry,但这似乎没有帮助,因为我不使用图块编号而是使用 latitude/longitude。
// 编辑 这甚至可行吗?或者更容易记下来,在每个缩放级别上移动 2D MapSCII 数组时有多少 lat/lng 变化?
让我们考虑以像素为单位的宽度和高度。
每像素米数的计算 (m/px) 01(一)像素表示的距离(S)由下式给出:
S=C*余弦(y)/2^(z+8) 其中:
C是地球赤道的周长; z 是缩放级别; y 是你想要获得比例的纬度。
来源:https://wiki.openstreetmap.org/wiki/Pt:Zoom_levels
将度数转换为弧度时出错。所以我导入了 pi 和转换。
from math import cos, pi
def calculate_boundaries(lat, lng, zoom, width, height): # -> tuple:
upper_left, lower_right = {}, {}
C = 40075 # km - Equator distance around the world
y = pi * lat / 180 # convert latitude degree to radian
S = C * cos(y) / 2 ** (zoom + 8) # km distance of 1 px - https://wiki.openstreetmap.org/wiki/Pt:Zoom_levels
S_deg = S * cos(y) / 100 # convert km (distance of 1 px) to degrees (coordinates)
upper_left['lat'] = lat + height / 2 * S_deg
upper_left['lng'] = lng - width / 2 * S_deg
lower_right['lat'] = lat - height / 2 * S_deg
lower_right['lng'] = lng + width / 2 * S_deg
return upper_left, lower_right
# main
lat = 51.5252178
lng = -0.0925642
zoom = 17 # zoom
width = 80 # considered as pixels
height = 24
upper_left, lower_right = calculate_boundaries(lat, lng, zoom, width, height)
print(upper_left, lower_right)