gpt4 book ai didi

python - Mapnik 不是 -85.0511° 到 85.0511° 形状问题

转载 作者:行者123 更新时间:2023-12-01 02:22:05 26 4
gpt4 key购买 nike

我有一个形状,其边界在经度上从 -180° 到 180°,但在纬度上,边界从 -90° 到 83.64513°。在使用leaflet的前端应用程序中,当它请求mapnik服务器提供图 block 图像时,我将图 block 位置转换为纬度/经度。经度有效,但纬度无效。我正在使用这个formula转换:

lat = arctan(sinh(pi*(1 - 2*y/2^zoom))) * 180/pi

问题(我真的不知道这是否是问题...)是这个公式承认纬度从-85.0511°到85.0511°,然后我得到像这样的错误此图片:

enter image description here

我可以采取什么措施来解决这个问题?更改形状大小(那么我该怎么做?),也许有一个通用公式可以传递任何纬度,或者我错过了一些步骤。

我没有使用上面的公式,而是尝试使用这个 code使用 GoogleTile 方法。得到相同的结果...

这是我正在使用的代码:

@app.route('/tiles/<z>/<x>/<y>', methods=['GET'])
def tiles(z, x, y):
filename = tiles_path + r"tile_%s_%s_%s.png" % (z, x, y,)
filename = filename.encode('ascii', 'ignore')
z = float(z); x = int(x); y = int(y)
if not os.path.isfile(filename):
x_1, y_1 = num2deg(x, y, z)
x_2, y_2 = num2deg(x + 1, y + 1, z)
envelope = mapnik.Envelope(x_1, y_1, x_2, y_2)
mapnik_map.zoom_to_box(envelope)
mapnik.render_to_file(mapnik_map, filename, "png")
return send_file(filename)

def num2deg(xtile, ytile, zoom):
n = 2.0 ** zoom
lon_deg = xtile / n * 360.0 - 180.0
lat_rad = atan(sinh(pi * (1 - 2 * ytile / n)))
lat_deg = degrees(lat_rad)
return lon_deg, lat_deg

如果我将 aspect_fix_mode 更改为 ADJUST_CANVAS_HEIGHT:

mapnik_map.aspect_fix_mode = mapnik.aspect_fix_mode.ADJUST_CANVAS_HEIGHT

我没有遇到上面的问题,但是设置这个后,我的 map 被拉长了并且扭曲。

这是shapefile我正在使用。

<小时/>

编辑:

Mapnik 默认投影:

map_obj.srs
>>> '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'
map_obj.layers[0].srs
>>> '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'
<小时/>

编辑2:

尝试修改 map 和图层srs,如下所示:

mapnik_map = mapnik.Map(256, 256, "+init=epsg:3857")
...
layer = mapnik.Layer("layer_name", "+init=epsg:4326")

但是当设置 map srs 时,不会专门渲染任何内容。

最佳答案

嗯,我在使用哪种投影标准方面犯了一个巨大的错误。由于我的数据位于 epsg:4326 中,我决定更改所有内容以适应此标准。以下是我为使事情顺利进行而所做的事情:

# creating the map
map = mapnik.Map(map_size, map_size, '+init=epsg:4326')

# creating a layer
layer = mapnik.Layer('layer', "+init=epsg:4326")

# tile to degree conversion (globalmaptiles.py adaptation)
# GlobalGeodetic.TileBounds
def tile2deg(tx, ty, zoom):
res = 180 / 256.0 / 2**zoom
return (
tx*256*res - 180,
ty*256*(-res) + 90,
(tx+1)*256*res - 180,
(ty+1)*256*(-res) + 90
)

# tile2deg usage
map_bounds = tile2deg(x, y, z)
envelope = mapnik.Envelope(*map_bounds)
map.zoom_to_box(envelope)

前端:

// leaflet map configuration
var map = L.map('map', {
center: [0, 0],
zoom: 1,
subdomains: [],
crs: L.CRS.EPSG4326,
tms: false,
});

希望将来能帮助像我这样的新手:)

关于python - Mapnik 不是 -85.0511° 到 85.0511° 形状问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47861359/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com