Plotly Choropleth 地图未正确显示 GeoJSON 数据 - 可能的几何或映射问题

问题描述 投票:0回答:1

我对

choropleth_mapbox()
很陌生,我不知道问题出在我的脚本中。我想显示各个投标区的平均现货市场能源价格。最终,我希望在这样的地图旁边有一个带有按钮的字段,这样我就可以选择适当的年、月或日,并且当我将鼠标悬停在地图上时,地图将改变其颜色并显示数据。可以找到类似的东西,例如这里:https://www.energy-charts.info/charts/price_average_map/chart.htm?l=en&c=EU。要显示此类数据,您首先需要 .shp 或 .geojson 文件,我从 https://github.com/EnergieID/entsoe-py/tree/master/entsoe/geo/geojson 下载这些文件。我将它们全部导入到 GIS 程序 (QGIS) 中,并将它们合并到带有属性表的一个文件中。 Bidding zones coupled in GIS program

我的解决方法和采取的步骤

但是,我在显示这些数据时遇到了麻烦,因此我决定作为测试,我将采用一种非常简单的方法来使用随机生成的数字来显示这些数据。然而,事实证明,所有内容都没有正确显示,并且地图上生成了一些随机形状,没有反映出价区域。

已采取的步骤

  1. 使用 GeoPandas 加载 shapefile。
  2. 确保“zoneName”列存在。
  3. 将 GeoDataFrame 重新投影到 EPSG:4326。
  4. 清理了 GeoDataFrame 以仅保留必要的列(“zoneName”和“geometry”)。
  5. 将 GeoDataFrame 转换为 GeoJSON。
  6. 使用 Plotly 的
    px.choropleth_mapbox
    创建地图。

Python代码:

import pandas as pd
from pathlib import Path
import json
import geopandas as gpd
import plotly.express as px
import numpy as np

#Path to file
curr_dir = Path.cwd()
project_root = Path(curr_dir.parent)
shapefile_file = project_root / 'Dane' / 'BIDDING ZONES2.shp'

#Loading shapefile
bidding_zones= gpd.read_file(shapefile_file)

# generation of random numbers from 0 to 100 in the same amount as number of bidding zones
num_zones = len(bidding_zones_test)
random_numbers = np.random.rand(num_zones) * 100

#Creation of DataFrame, which would be necessary in choropleth_mapbox()
#Mapping of zoneName (key) of each bidding zone with random values to display later on
df = pd.DataFrame({
    'zoneName': bidding_zones_test['zoneName'],
    'random_value': random_numbers

# Convert GeoDataFrame to GeoJSON
countries = json.loads(bidding_zones.to_json())
})

# Create an interactive map
fig = px.choropleth_mapbox(df,
    geojson=countries,
    locations='zoneName',
    featureidkey="properties.zoneName",
    color='random_value',
    color_continuous_scale="Viridis",
    range_color=(0, 12),
    mapbox_style="carto-positron",
    zoom=0.5,
    center={"lat": 52.0, "lon": 19.0},  # Center on Poland
    opacity=0.2
)

fig.update_layout(
    title_text='Test Display of Shapefile',
    title_x=0.5
)

fig.show()

结果

我正在其他线程中寻找解决方案,例如: Plotly Choropleth_mapbox 与 Dash 交互性图,但我不完全理解这一点,因为这个 .shp 文件不是像我的那样生成的。在 shp 文件和 df 数据框中的数据之间有一个“zoneName”形式的键,但它没有正确映射,请在此处查看Fig.show()的输出 Problem choropleth_mapbox()

Geojson结构

Geojson 顶部

{
    "type": "FeatureCollection",
    "features": [
        {
            "id": "0",
            "type": "Feature",
            "properties": {
                "zoneName": "AT",
                "layer": "AT",
                "path": "C:/Users/User/Downloads/AT.geojson"
            },
            "geometry": {
                "type": "Polygon",
                "coordinates": [
                    [
                        [
                            348557.28869994543,
                            83876.34420647845
                        ],
                        [
                            349103.56787464337,
                            78661.40107473545
                        ],
python pandas shapefile choropleth
1个回答
0
投票

是的!感谢@Bera带领我走上正确的道路。你是对的!问题出在我生成的 QGIS 文件和这些国家投标区的投影中。我后退了几步,再次将所有 geojson 区域文件加载到 QGIS,然后 enter image description here

之后,我尝试了 QGIS 中的“合并矢量图层”选项,并选择正确的投影,即 EPSG 4326。然后将文件加载到我的 python 脚本中,瞧!就是这个效果:)

Efekt

我还更改了 python 代码中的一些内容。我决定直接从 geojson 加载,而不是从 shapefile 加载,但它相信最终这根本没有关系。现在我将转向另一个步骤 - 尝试加载每个投标国家/地区的平均价格:)

© www.soinside.com 2019 - 2024. All rights reserved.