Преобразовать оператор SQL в GeoAlchemy - PullRequest
0 голосов
/ 17 июня 2020

Я в процессе создания тайлового сервера, и у меня есть приведенный ниже оператор SQL, который идеально создает тайлы. Я только изучаю SqlAlchemy и GeoAlchemy и хотел бы получить несколько указателей о том, где начать преобразование приведенного ниже запроса в запрос GeoAlchemy.

У меня есть функции, которых обычно не существует в GeoAlchemey:

class ST_AsMVTGeom(GenericFunction):
    name = 'ST_AsMVTGeom'
    type = Geometry


class ST_AsMVT(functions.GenericFunction):
    type = BYTEA

Нижеприведенный оператор используется в настоящее время:

def envelopeToSQL(tbl, z, x, y):
    #https://github.com/pramsey/minimal-mvt/blob/8b736e342ada89c5c2c9b1c77bfcbcfde7aa8d82/minimal-mvt.py#L119-L137
    env = tileToEnvelope(z,x,y)
    tbl = {**tbl, **env} 
    # Materialize the bounds, select the relevant geometry and clip to MVT bounds, convert to MVT format
    sql_tmpl= """WITH webmercator(envelope) AS (
            SELECT ST_Segmentize(ST_MakeEnvelope({xmin}, {ymin}, {xmax}, {ymax}, 3857),{segSize}) AS geom, 
                   ST_Segmentize(ST_MakeEnvelope({xmin}, {ymin}, {xmax}, {ymax}, 3857),{segSize})::box2d AS b2d
        ),
        wgs84(envelope) AS (
          SELECT ST_Transform((SELECT envelope FROM webmercator), {srid})
        ),
        geometries({attrColumns}, geom) AS (
          SELECT {attrColumns}, ST_Transform(ST_Intersection(geom, ST_MakeEnvelope(-180, -89.9, 180, 89.9, {srid})), 3857)
          FROM  {tableName}
          WHERE geom && (SELECT envelope FROM wgs84)   -- do not read objects outside the tile
        )
        SELECT ST_AsMVT(tile) FROM (
          SELECT {attrColumns}, ST_AsMVTGeom(geom, (SELECT envelope FROM webmercator), {extent}, 256, false)
          FROM geometries
        ) AS tile"""#.format(**tbl)#.format(z, x, y, TableName)


    return sql_tmpl.format(**tbl) 

Есть предложения, где начать преобразование его в оператор геоалхимии?

...