Bokeh没有从GeoJson正确地呈现multipolygon(islands)

2024-09-23 22:19:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我在博克绘制一张合唱团地图。我的地理数据是一个带有多边形和多角形的GeoJSON。在

我无法渲染多边形:

如果我提取一个特征的所有几何图形(例如,在一个列表中有四个岛),它们的图不会在图形之间“剪切”,它们看起来都是一个。 它显示了一些“蜘蛛网”的东西,无序地穿过所有的点。在

如果我为island创建一个列表(我认为这是正确的方法),Bokeh不会绘制任何内容。即使是网格(只有工具栏)…也不显示任何错误。在

可能是函数“obtcoordmultiligono”的输出有问题。在

我在岛上找过一些例子,但没有什么能帮上我。在

提前谢谢。在

更新: 我加上我的片段。它们是原始的碎片,但功能强大。 这个想法是一个类似于“德克萨斯州失业”的产出,但我的国家有岛屿。在

我的GeoJSON在阿根廷.json(仅提取1个多重多边形;我对多边形没有问题):

    {
    "type": "FeatureCollection",
    "features": [

    {
      "geometry": {
        "type": "MultiPolygon",
        "coordinates": [
          [
            [
              [
                -59.68266601562502,
                -52.231640624999976
              ],
              [
                -59.74658203124997,
                -52.25087890624999
              ],
              [
                -59.76445312499996,
                -52.2421875
              ],
              [
                -59.784863281249955,
                -52.2046875
              ],
              [
                -59.78593749999999,
                -52.156152343749966
              ],
              [
                -59.79331054687498,
                -52.134179687500016
              ],
              [
                -59.75322265624999,
                -52.14140624999998
              ],
              [
                -59.681005859375034,
                -52.18007812499995
              ],
              [
                -59.68266601562502,
                -52.231640624999976
              ]
            ]
          ],
          [
            [
              [
                -58.438818359375006,
                -52.011035156249974
              ],
              [
                -58.432714843750006,
                -52.09902343749996
              ],
              [
                -58.512841796874966,
                -52.071093750000045
              ],
              [
                -58.54140625000002,
                -52.02841796874996
              ],
              [
                -58.49707031249997,
                -51.99941406250001
              ],
              [
                -58.46054687499998,
                -52.0015625
              ],
              [
                -58.438818359375006,
                -52.011035156249974
              ]
            ]
          ],
          [
            [
              [
                -61.01875,
                -51.7857421875
              ],
              [
                -60.94726562499997,
                -51.79951171875005
              ],
              [
                -60.87597656250003,
                -51.79423828125004
              ],
              [
                -60.91616210937494,
                -51.89697265625001
              ],
              [
                -60.94755859374996,
                -51.94628906250002
              ],
              [
                -61.031982421875,
                -51.94248046875004
              ],
              [
                -61.11577148437493,
                -51.87529296875003
              ],
              [
                -61.14501953125003,
                -51.83945312500001
              ],
              [
                -61.05166015625002,
                -51.81396484374997
              ],
              [
                -61.01875,
                -51.7857421875
              ]
            ]
          ],
          [
            [
              [
                -60.11171875000002,
                -51.39589843749998
              ],
              [
                -60.24882812499996,
                -51.39599609375
              ],
              [
                -60.27587890624997,
                -51.36318359374997
              ],
              [
                -60.275341796874955,
                -51.28056640625002
              ],
              [
                -60.17138671875,
                -51.273437499999986
              ],
              [
                -60.06982421875,
                -51.307910156249996
              ],
              [
                -60.07646484374993,
                -51.34257812500004
              ],
              [
                -60.11171875000002,
                -51.39589843749998
              ]
            ]
          ]

        ]
      },
      "type": "Feature",
      "properties": {
        "perimeter": 0,
        "vista": "mim",
        "provincia": "Islas Malvinas",
        "objectid": 24,
        "prov": 0,
        "bounds": [
          0,
          0
        ],
        "provif3_": 27.0,
        "ogc_fid": 26,
        "provif3_id": 26.0
      }
    }
    ]
    }

我的数据在PBIArg.csv

24,AR-V,Islas,13245

我的代码:

^{pr2}$

Tags: 数据图形列表geojsontype地图绘制特征
1条回答
网友
1楼 · 发布于 2024-09-23 22:19:40

如果使用Bokeh的GeoJSONDataSource,就可以大大简化代码,而不是遵循最初的“Texas example”。在

使用geojson的精简示例如下所示:

from bokeh.io import show, output_notebook, output_file
from bokeh.models import (
    GeoJSONDataSource,
    HoverTool,
    LinearColorMapper
)
from bokeh.plotting import figure
from bokeh.palettes import Viridis6

with open(r'argentina.geojson', 'r') as f:
    geo_source = GeoJSONDataSource(geojson=f.read())


color_mapper = LinearColorMapper(palette=Viridis6)

TOOLS = "pan,wheel_zoom,box_zoom,reset,hover,save"

p = figure(title="Argentina", tools=TOOLS, x_axis_location=None, y_axis_location=None, width=500, height=300)
p.grid.grid_line_color = None

p.patches('xs', 'ys', fill_alpha=0.7, fill_color={'field': 'objectid', 'transform': color_mapper}, 
          line_color='white', line_width=0.5, source=geo_source)


hover = p.select_one(HoverTool)
hover.point_policy = "follow_mouse"
hover.tooltips = [("Provincia:", "@provincia")]

output_file("PBIar.html", title="Testing islands in bokeh")

show(p)

输出结果如下: enter image description here

编辑:

这就是下面的注释中提到的使用整个geojson时的输出。在

enter image description here

在南部的岛屿上放大:

enter image description here

更新:可变数据功能

我添加这个函数是为了以交互方式编辑geoJSON,这取决于传递的JSON数据。在

geoJSON现在有“data”属性和状态国际代码(属性:“ISO_-2”)。在

JSON数据如下:

^{pr2}$

函数读取geoJSON并分配数据:

def asignDataToStates(geo,data):
    for pcia in geo['features']:
        codPcia = str(pcia['properties']['ISO_3166-2'])

        if codPcia in data.keys():
            if data.values() != 0:
                pcia['properties']['data'] = data[codPcia]
    dataJson = json.dumps(geo,ensure_ascii=True)
    return dataJson

相关问题 更多 >