передача мультиполигона, а не граничного блока, через таблицу Crate DB

У меня есть фрейм данных геопанд под названием geodf. Геометрия каждой строки в этом фрейме данных представляет собой мультиполигон. Например, если мы рассмотрим первую строку в столбце геометрии через фрейм геоданных:

bound = geodf['geometry'].iloc[0]
print(bound)

это выглядит примерно так:

MULTIPOLYGON (((-86.46228799973933 34.31021100007911, -86.46447100007661 34.31018399970606, -86.46447800010341 34.31197299998977, -86.4623920000716 34.31198799958079

Сам по себе мультиполигон массивный, поэтому я попытался создать для него коробку.

box = shapely.geometry.box(*geodf.bounds)

а затем я передал box через следующий запрос через наш сервер Crate DB:

query = """
                 SELECT geohash, grid,shape 
                 FROM geo 
                 WHERE layer = 'pop' 
                AND MATCH(shape, '{}') USING within;
          """.format(box)
geoCursor.execute(query)
results = geoCursor.fetchall()
District = gpd.GeoDataFrame(results, columns = ['geohash', 'grid','shape'])

где я передаю polygonbox в запросе выше через .format(box)

Вместо этого я хотел бы передать bound вместо box в запросе выше (обратите внимание, что запрос выше работает для box). Однако когда я пытаюсь пройти bound, я получаю следующую ошибку:

ProgrammingError: SQLActionException[UnhandledServerException: java.lang.IllegalArgumentException: Cannot convert Map "{type=MultiPolygon, coordinates=[[[[D@2b59d486}" to shape]

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


person M3105    schedule 08.02.2018    source источник


Ответы (1)


Вы можете представить мультиполигон как dict, похожий на формат geoJSON, а затем использовать подстановку параметров. Я не знаком с shapely, поэтому не могу комментировать, как вы получаете представление dict, но со словарем, созданным вручную, это будет выглядеть следующим образом:

multipolygon = {
    "type": "MultiPolygon",
    "coordinates": [
        [
            [
                [ 40.0, 40.0 ],
                [ 20.0, 45.0 ],
                [ 45.0, 30.0 ],
                [ 40.0, 40.0 ]
            ]
        ],
        [
            [
                [ 20.0, 35.0 ],
                [ 10.0, 30.0 ],
                [ 10.0, 10.0 ],
                [ 30.0, 5.0 ],
                [ 45.0, 20.0 ],
                [ 20.0, 35.0 ]
            ],
            [
                [ 30.0, 20.0 ],
                [ 20.0, 15.0 ],
                [ 20.0, 25.0 ],
                [ 30.0, 20.0 ]
            ]
        ]
    ]
}

c.execute('select * from t where match(x, ?) using within', (multipolygon, ))
print(c.fetchall())
person mfussenegger    schedule 12.02.2018