2017-12-18 14 views
1

私は経度で-180度から180度の境界線がありますが、緯度では-90度から83.64513度になります。 leafletを使用しているフロントエンドアプリケーションでは、mapnikのタイルイメージをサーバーに要求するときに、タイルの位置を緯度/経度に変換します。経度は機能しますが、緯度はありません。私は変換するには、このformulaを使用しています:Mapnik not-85.0511º〜85.0511ºshape issue

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

問題(それが問題だ場合、私は本当に分からない...)は、この式は、緯度から行くこと-85.0511º85.0511ºに認めているということです、その後、私は、この画像のようにerrosを取得しています:私はこの問題を回避するために

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 

私はADJUST_CANVAS_HEIGHTaspect_fix_modeを変更する場合:

mapnik_map.aspect_fix_mode = mapnik.aspect_fix_mode.ADJUST_CANVAS_HEIGHT 

私は上記の問題を持っていませんしかし、これを設定すると、地図が伸びて に歪んで歪んでしまいます。

私はshapefileを使用しています。


EDIT:

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' 

EDIT 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)にあります。これは、TMS Global Geodetic Profileを参照するコードでサポートされているタイル形式の1つです – user27874

+0

編集を参照してください。 [ここ](https://github.com/mapnik/mapnik/wiki/GettingStartedInPython)、これは言っています:_the '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, 
}); 

・ホープ将来的には私のような誰かの初心者を助けるために:)