Mapnik不是-85.0511º到85.0511º形状问题

问题描述 投票:1回答:1

我的形状在经度上从-180º到180º,但在纬度上,从-90º到83.64513º。在使用leaflet的前端应用程序中,当它向mapnik服务器请求图块时,我将图块位置转换为纬度/经度。经度有效,但纬度没有。我正在使用这个formula转换:

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

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

enter image description here

我该怎么做才能解决这个问题?改变形状大小(那我该怎么做?),也许有一个通用的公式,我可以通过任何纬度或我错过了一些步骤。

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

这是我正在使用的代码:

@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

我没有上面的问题,但设置这个,我得到地图伸展和扭曲。

这是我正在使用的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:

试图像这样修改地图和图层srs

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

但是当设置地图srs时,没有任何特别的渲染。

python gis shapefile map-projections mapnik
1个回答
2
投票

好吧,我在使用哪个投影标准时犯了一个大错。由于我的数据是在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,
});

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

© www.soinside.com 2019 - 2024. All rights reserved.