1 votos

El zoom PostGIS Vector Tiles afecta a la producción de azulejos

Estoy construyendo un pequeño servicio de azulejos para presentar datos postgis sobre la marcha a un mapa de folletos.

para las pruebas estoy utilizando el conjunto de datos ne_110m_admin_0_countries

El primer problema es la extensión de las baldosas devueltas, muchas presentan errores en patrones predecibles. Por ejemplo, en el zoom 0 no se dibuja ningún mosaico por debajo del ecuador.

zoom 0

entre zoom 0 y 3 Nueva Zelanda no existe

zoom 3

y también en el zoom 3 no aparece nada por debajo de 41 grados sur, sin embargo este comportamiento no existe reflejado en el hemisferio norte.

zoom 3 again Estoy usando el siguiente para servir a los azulejos en un servidor de matraz:

@app.route('/tiles/test/<int:z>/<int:x>/<int:y>', methods=['GET'])
@login_required
def tiles(z=0, x=0, y=0):

    tile = get_tile(z, x, y, 'ne_110m_admin_0_countries')
    if tile != None:
        response = make_response(tile)
        response.headers['Content-Type'] = "application/octet-stream"
        return response
    else:
        return ('', 502)

def get_tile(z,x,y,TableName):
    cursor = db.connection.cursor()

    query= """WITH webmercator(envelope) AS (
              SELECT ST_TileEnvelope({},{},{})   -- z, x, y
            ),
            wgs84(envelope) AS (
              SELECT ST_Transform((SELECT envelope FROM webmercator), 4326)
            ),
            geometries(id, geom) AS (
              SELECT id, ST_Transform(geom, 3857)
              FROM  {}
              WHERE geom && (SELECT envelope FROM wgs84)   -- do not read objects outside the tile
            )
            SELECT ST_AsMVT(tile) FROM (
              SELECT id, ST_AsMVTGeom(geom, (SELECT envelope FROM webmercator))
              FROM geometries
            ) AS tile""".format(z, x, y, TableName) 
    try:
        cursor.execute(query)#,(z,x,y)) 
        tile = bytes(cursor.fetchone()[0])
        cursor.close()
        return tile
    except:
        cursor.execute("rollback")

En zonas horarias de tierra natural también muestran problemas extraños cuando se aleja el zoom. Por ejemplo, en el nivel de zoom 4 la longitud de las baldosas es de hasta 158 grados este/oeste, en el zoom 3 es de 135 grados, y en el zoom 2 se restringe aún más a sólo 90 grados este/oeste.

¿Alguna sugerencia sobre por qué el zoom podría estar afectando a los azulejos mostrados?

Cuídense todos.

2voto

Mikaveli Puntos 126

Que autoexplicativo mensaje de error "error de condición de tolerancia (-20)" es obviamente lanzado por ST_Transform cuando no es capaz de transformar alguna coordenada. En este caso, el problema es que el Web Proyección Mercator no es capaz de mostrar datos cerca de los polos.

Puedes cambiar los datos de la tabla recortando las coordenadas que se encuentren más allá del borde del mundo (unos ±85°):

UPDATE ne_110m_admin_0_countries
SET geom = ST_Intersection(geom, ST_MakeEnvelope(-180, -85, 180, 85, 4326))
WHERE geom && ST_MakeEnvelope(-180, -90, 180, -85, 4326)
   OR geom && ST_MakeEnvelope(-180,  85, 180,  90, 4326);

También puede hacer el mismo recorte cada vez que lea datos de la tabla:

...
SELECT id, ST_Transform(ST_Intersection(...), 3857)
FROM ...

El segundo problema es cómo se gestionan las transacciones. La especificación DB-API de Python ordena que las transacciones se abran automáticamente, pero deben cerrarse manualmente (lo cual es una tontería). Podrías confirmar la transacción después de cada petición, pero es una mejor idea simplemente establecer autocommit inmediatamente después de abrir la conexión para que los errores en un mosaico no afecten a todas las peticiones siguientes.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X