使用 Folium GeoJson 绘制 Pandas Dataframe 数据

Plotting Pandas Dataframe data using Folium GeoJson

我正在尝试使用 Python 和热图绘制卫星经过某个位置的次数。我很容易生成卫星数据,但在以良好的方式显示它时遇到了问题。我正在尝试遵循 this example,因为我可以使用样式功能来降低不透明度。我在复制这个时遇到了一些问题,因为他们使用的 GeoJson 版本似乎不再接受相同的输入。这是我正在使用的数据框:

print(df.head())
     latitude  longitude  countSp                     geometry
0     -57.9      151.1      1.0  POLYGON ((151.05 -57.95, 151.15 -57.95, 151.15...
1     -57.9      151.2      2.0  POLYGON ((151.15 -57.95, 151.25 -57.95, 151.25...
2     -57.8      151.2      1.0  POLYGON ((151.15 -57.84999999999999, 151.25 -5...
3     -57.8      151.3      3.0  POLYGON ((151.25 -57.84999999999999, 151.35 -5...
4     -57.8      151.4      2.0  POLYGON ((151.35 -57.84999999999999, 151.45 -5...

然后我通过以下方式调用 folium:

hmap = folium.Map(location=[42.5, -80], zoom_start=7, )
colormap_dept = branca.colormap.StepColormap(
        colors=['#00ae53', '#86dc76', '#daf8aa',
            '#ffe6a4', '#ff9a61', '#ee0028'],
        vmin=0,
        vmax=max_amt,
        index=[0, 2, 4, 6, 8, 10, 12])
    
style_func = lambda x: {
        'fillColor': colormap_dept(x['countSp']),
        'color': '',
        'weight': 0.0001,
        'fillOpacity': 0.1
    }

folium.GeoJson(
    df,
    style_function=style_func,
).add_to(hmap)

这是我在 运行 我的代码时遇到的错误:

ValueError: Cannot render objects with any missing geometries: latitude  longitude  countSp  geometry

我知道我可以使用 folium 的 HeatMap 插件来完成大部分工作,但我发现这样做有几个问题。首先是我无法轻易生成图例(尽管我已经能够解决这个问题)。其次是它太不透明了,我没有找到任何减少它的方法。我试过在没有太大变化的情况下使用 HeatMap 的半径和模糊参数。我认为上面 style_func 的 fillOpacity 是使我的数据半透明的更好方法。

顺便说一下,我通过以下命令在我的 df 中生成多边形。所以在我的数据框中,我需要 folium 知道的只是几何形状和 countSp(这是卫星经过某个区域的次数 - ~10kmx10km 平方)。

    df['geometry'] = df.apply(lambda row: Polygon([(row.longitude-0.05, row.latitude-0.05), 
                                               (row.longitude+0.05, row.latitude-0.05),
                                               (row.longitude+0.05, row.latitude+0.05),
                                               (row.longitude-0.05, row.latitude+0.05)]), axis=1)

有解决这个问题的好方法吗?

再一次,他们在寻找一种在热图中表达目的的方法,所以我使用 Plotly 的航空公司到达和离开数据来可视化它。

往返U.S的航班数量。数据仅用于大陆

排除的 IATA 代码['LIH','HNL','STT','STX','SJU','OGG','KOA']

  • 在地图上从出发机场的经纬度到到达机场的经纬度画一条直线

  • 根据机场的到达和离开数量数据绘制热图。

  • 由于我们不能使用离散颜色图,我们将创建一个线性颜色图并添加它。

  • 将热图嵌入为名为 Traffic 的图层

import pandas as pd

df_airports = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/2011_february_us_airport_traffic.csv')
df_airports.sort_values('cnt', ascending=False)
df_air = df_airports[['lat','long','cnt']]

df_flight_paths = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/2011_february_aa_flight_paths.csv')

df_flight_paths = df_flight_paths[~df_flight_paths['airport1'].isin(['HNL','STT','SJU','OGG','KOA'])]
df_flight_paths = df_flight_paths[~df_flight_paths['airport2'].isin(['LIH','HNL','STT','STX','SJU'])]

df_flight_paths = df_flight_paths[['start_lat', 'start_lon', 'end_lat', 'end_lon', 'cnt']]

import folium
from folium.plugins import HeatMap
import branca.colormap as cm
from collections import defaultdict

steps=10
colormap = cm.linear.YlGnBu_09.scale(0, 1).to_step(steps)
gradient_map=defaultdict(dict)

for i in range(steps):
    gradient_map[1/steps*i] = colormap.rgb_hex_str(1/steps*i)
    
m = folium.Map(location=[32.500, -97.500], zoom_start=4, tiles="cartodbpositron")

data = []
for idx,row in df_flight_paths.iterrows():
    folium.PolyLine([[row.start_lat, row.start_lon], [row.end_lat, row.end_lon]], weight=2, color="red", opacity=0.4
).add_to(m)
    
HeatMap(
    df_air.values,
    gradient=gradient_map,
    name='Traffic',
    mini_opacity=0.1,
    radius=15,
    blur=5
).add_to(m)

folium.LayerControl().add_to(m)
colormap.add_to(m)
m