Фрейм данных Geopandas в индекс GeoJSON в Elasticsearch?

У меня вопрос, связанный с этим вопросом: Я ' m относительно новичок в Python и теперь начал визуализировать в Kibana, в котором я новичок (например, я никогда не использовал его раньше). Теперь у меня есть геосети pandas datafram вроде этого:

    ID      Geometry
0   9417    POLYGON ((229611.185 536552.731, 229611.100 53...
1   3606    POLYGON ((131122.280 460609.117, 131108.312 46...
2   1822    POLYGON ((113160.653 517762.384, 113169.755 51...
3   7325    POLYGON ((196861.725 470370.632, 196869.990 47...
4   9258    POLYGON ((201372.387 579807.340, 201373.195 57...

И я хотел бы создать карту с этими полигонами в кибане, но я действительно не знаю, как это сделать. Я читал разные части по elasticsearch и stackoverflow, но не могу собрать нужные части вместе. Дело в том, что в нашем проекте мы хотим импортировать данные на python, немного предварительно обработать их и экспортировать в kibana. Итак, существует процесс Python - GeoJSON - Elasticsearch [7.6], и вся литература, которую я нашел, не включает все эти 3 ресурса, поэтому я не уверен, что делать дальше.

Я также попытался сохранить файл как GeoJSON, а затем импортировать его через панель управления Kibana в визуализации карты, например говорится в этой инструкции. Когда я импортирую данные, мой файл не будет индексироваться и, следовательно, не будут визуализированы мои данные.

Я читал о том, что нельзя проиндексировать целый многоугольник, но я должен разбить его на координаты. Моя проблема в том, что я не могу найти хороший способ сделать это в Python. Также я читал, что индекс в Elasticsearch должен иметь правильное сопоставление для геоиндексации. Но опять же, я застрял при создании этого географического сопоставления из python.

Может кто-нибудь мне помочь :)?


person Lotw    schedule 29.04.2020    source источник


Ответы (1)


Это должно помочь вам начать:

  1. Импортировать и инициализировать
import shapely.geometry
import geopandas
from elasticsearch import Elasticsearch
import json

es = Elasticsearch(['http://localhost:9200'])
geoindex = None
  1. Получить или создать индекс (+ отображение, если необходимо)
try:
    geoindex = es.indices.get('geoindex')
except Exception:
    geoindex = es.indices.create('geoindex', {
        "mappings": {
            "properties": {
                "polygon": {
                    "type": "geo_shape",
                    "strategy": "recursive"
                }
            }
        }
    })

  1. Выгрузить как json и загрузить обратно в dict (вдохновленный this; я подозреваю, что должен быть более чистый способ)
shapely_polygon = shapely.geometry.Polygon([(0, 0), (0, 1), (1, 0)])
geojson_str = geopandas.GeoSeries([shapely_polygon]).to_json()
  1. Итерировать и синхронизировать с ES
for feature in json.loads(geojson_str)['features']:
    es.index('geoindex', { "polygon": {
        "type": "polygon",
        "coordinates": feature['geometry']['coordinates']
    }}, id=feature['id'])
  1. Проверять
count = es.count({}, 'geoindex')
print(count)
  1. Визуализировать
person Joe Sorocin    schedule 29.04.2020
comment
Большое вам спасибо, я знаю, что, вероятно, есть исследования каждого отдельного элемента, чтобы собрать эти шаги вместе, но я действительно не мог понять этого и застревал в течение 3 дней, так что полезно собрать его небольшими частями вместе :)! - person Lotw; 29.04.2020