PostgreSQL ST_AsMVT в VectorTiles к слою листовки - PullRequest
1 голос
/ 20 марта 2020

Я пытаюсь создать векторные листы из базы данных PostgreSQL и подавать их через flask на карту Leaflet. Я следил за этой medium.com статьей , которая дошла до меня почти до конца.

Однако, когда я открываю страницу с картой Leaflet, я получаю в консоли браузера следующее:

index. js: 191 Uncaught Error: Unimplemented type: 4 в Pbf.skip (index. js: 191) в Pbf.readFields (index. js: 41) в новом VectorTile $ 1 (vectortile. js: 8) в FileReader. (Leaflet.VectorGrid.Protobuf. * ​​1028 *: 124)

для создания плиток я использую следующее:

  def tile_ul(x, y, z):
    n = 2.0 ** z
    lon_deg = x / n * 360.0 - 180.0
    lat_rad = math.atan(math.sinh(math.pi * (1 - 2 * y / n)))
    lat_deg = math.degrees(lat_rad)
    return  lon_deg,lat_deg

    def get_tile(z,x,y):
        xmin,ymin = tile_ul(x, y, z)
        xmax,ymax = tile_ul(x + 1, y + 1, z)
        tile = None
        query = """SELECT ST_AsMVT(tile) FROM (SELECT id, ST_AsMVTGeom(geom, ST_Makebox2d(ST_transform(ST_SetSrid(ST_MakePoint(%s,%s),4326),3857),ST_transform(ST_SetSrid(ST_MakePoint(%s,%s),4326),3857)), 4096, 0, false) AS geom FROM "TimeZone (LineGridExp)") AS tile"""
cursor = db.connection.cursor()
cursor.execute(query,(xmin,ymin,xmax,ymax))
tile = str(cursor.fetchone()[0])
cursor.close()
return tile

@app.route('/tiles')
@app.route('/tiles/<int:z>/<int:x>/<int:y>', methods=['GET'])
def tiles(z=0, x=0, y=0):
    tile = get_tile(z, x, y)
    response = make_response(tile)
    response.headers['Content-Type'] = "application/octet-stream"
    return response

Чтобы добавить плитки в листовку, я использую:

var url = "http://localhost:5000/tiles/{z}/{x}/{y}"
var mapillaryLayer = L.vectorGrid.protobuf(url).addTo(mymap);

Конец python получает GET от клиента и не выдает никаких ошибок. Однако я не уверен насчет запроса SQL и обнаружения пустых фрагментов или того, является ли запрос просто неправильным.

Любая помощь будет принята с благодарностью.

Том

1 Ответ

1 голос
/ 20 марта 2020

Все дело в том, что запрос не возвращает данные, а также возвращается как байты, а не как str:

 def get_tile(z,x,y):
    xmin, ymin = tile_ul(x, y, z)
    xmax, ymax = tile_ul(x + 1, y + 1, z)
    query = """SELECT ST_AsMVT(tile) FROM (
               SELECT id, ST_AsMVTGeom(geom, ST_MakeEnvelope( %s, %s, %s, %s ,4326), 4096, 256, false ) geom 
               FROM reproject ) as tile"""
    cursor = db.connection.cursor()
    cursor.execute(query,(xmin,ymin,xmax,ymax))
    tile = bytes(cursor.fetchone()[0])
    cursor.close()
    return tile
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...