Mapnik没有-85.0511º到85.0511º形状问题

我有一个边界从-180º到180º的经度,但纬度从-90º到83.64513º。在使用leaflet的前端应用程序中,当它要求mapnik服务器显示图块时,我将图块位置转换为经度/纬度。经度适用,但纬度不适用。我使用这个formula转换:Mapnik没有-85.0511º到85.0511º形状问题

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

问题(我真的不知道,如果这是问题...)的是,这个公式也承认,纬度去从-85.0511º到85.0511º ,然后我得到错误回报这样的形象:

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

而不是使用上面的公式,我也尝试使用此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_modeADJUST_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设置专门呈现。

回答:

嗯,我在制定一个关于使用哪种投影标准的巨大错误。由于我的数据在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,

});

希望能帮助别人新手像我这样在未来:)

以上是 Mapnik没有-85.0511º到85.0511º形状问题 的全部内容, 来源链接: utcz.com/qa/260529.html

回到顶部