【问题标题】:Geopandas dataframe to GeoJSON to Elasticsearch index?Geopandas 数据框到 GeoJSON 到 Elasticsearch 索引?
【发布时间】:2020-08-13 09:34:26
【问题描述】:

我有一个与 this question 相关的问题:我对 python 比较陌生,现在已经开始在 Kibana 中进行可视化,我是全新的(因为我以前从未使用过它)。现在我有一个像这样的熊猫数据帧地理序列:

    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...

我想在 kibana 中用这些多边形创建一个地图,但我真的不知道怎么做。我已经阅读了有关 elasticsearch 和 stackoverflow 的不同部分,但我无法将正确的部分放在一起。问题是,在我们的项目中,我们希望在 python 中导入数据,对其进行一些预处理,然后将其导出到 kibana。所以有一个 Python - GeoJSON - Elasticsearch [7.6] 流程,我发现的所有文献都不包括所有这 3 个资产,所以我不确定如何继续。

我还尝试将文件保存为 GeoJSON,然后通过 Kibana 仪表板将其导入地图可视化中,如 this instruction 所说。当我导入数据时,它不会为我的文件提供索引,因此不会可视化我的任何数据。

我确实读过关于如何不能索引整个多边形,但我应该将其拆分为坐标。我的问题是我找不到在 python 中执行此操作的好方法。我还读到 Elasticsearch 中的索引应该具有正确的地理索引映射。但同样,我被困在从 python 创建这个地理映射。

有人可以帮我吗:)?

【问题讨论】:

    标签: python elasticsearch indexing geojson kibana-7


    【解决方案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. 可视化

    【讨论】:

    • 非常感谢,我知道每个单独的元素可能都进行了研究以将这些步骤组合在一起,但我真的无法弄清楚并且已经卡住了 3 天,因此很有帮助把它分成小块:)!
    猜你喜欢
    • 1970-01-01
    • 2017-04-24
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    • 2016-03-31
    相关资源
    最近更新 更多