使用 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
我正在尝试使用 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