2017-12-18 90 views
1

我有一個邊界從-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º ,然後我得到錯誤回報這樣的形象:

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_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設置專門呈現。

+1

關於Mapnik的不知道,不是嗎在[Pseudo-Mercator](http://epsg.io/3857)中指定瓷磚?數據似乎在[EPSG:4326](http://epsg.io/4326)中,它是您參考的代碼中支持的Tile格式之一'TMS Global Geodetic Profile' – user27874

+0

請參閱編輯。 [Here](https://github.com/mapnik/mapnik/wiki/GettingStartedInPython),這是說:_'map.srs'是地圖的目標投影,可以是任何你想要的。 –

回答

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, 
}); 

希望能幫助別人新手像我這樣在未來:)