Мапник не от -85.0511º до 85.0511º вопрос формы
У меня есть форма, границы которой идут от -180º до 180º по долготе, а по широте - от -90º до 83,64513º. В интерфейсном приложении, использующем leaflet
когда он просит mapnik
Сервер изображения плитки, я преобразую позиции плитки в широту / долготу. Долгота работает, а широта - нет. Я использую эту формулу для преобразования:
lat = arctan(sinh(pi*(1 - 2*y/2^zoom))) * 180/pi
Проблема (я не знаю, если это проблема...) в том, что эта формула допускает, что широта идет от -85.0511º до 85.0511º, тогда я получаю ошибки, как на этом изображении:
Что я мог сделать, чтобы обойти эту проблему? Измените размер фигуры (тогда как я могу это сделать?), Может быть, есть общая формула, которую я мог бы передать на любой широте, или я пропускаю какой-то шаг.
Вместо того, чтобы использовать формулу выше, я также попытался использовать этот код с 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_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 ответ
Ну, я сделал огромную ошибку в том, какой стандарт проекции использовать. Как мои данные в 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,
});
Надеюсь помочь кому-нибудь, как я, новичку в будущем:)