在 folium 中使用地理数据框绘制彩色多边形
Posted
技术标签:
【中文标题】在 folium 中使用地理数据框绘制彩色多边形【英文标题】:Plot colored polygons with geodataframe in folium 【发布时间】:2016-06-01 16:13:50 【问题描述】:我正在尝试在 folium 中绘制雷达数据,并且快到了。我按照这个示例 (Contour plot data (lat,lon,value) within boundaries and export GeoJSON) 将我的数据转换为 GeoJson 格式。
nb_class = 20
collec_poly = plt.contourf(lons,lats,np.array(poshdata), nb_class,alpha=0.5)
gdf = collec_to_gdf(collec_poly) # From link above
gdf.to_json()
colors = [p.get_facecolor().tolist()[0] for p in collec_poly.collections]
gdf['RGBA'] = colors
gdf
这会输出两列:几何和 RGBA。
RGBA geometry
0 [0.0, 0.0, 0.713903743316, 1.0] (POLYGON ((-71.57032079644679 42.2775236331535...
1 [0.0, 0.0960784313725, 1.0, 1.0] (POLYGON ((-71.56719970703125 42.2721176147460...
2 [0.0, 0.503921568627, 1.0, 1.0] (POLYGON ((-71.55678558349609 42.2721176147460...
3 [0.0, 0.896078431373, 0.970904490829, 1.0] (POLYGON ((-71.52552795410156 42.2849182620049...
4 [0.325743200506, 1.0, 0.641998734978, 1.0] (POLYGON ((-71.49427795410156 42.2939676156927...
5 [0.641998734978, 1.0, 0.325743200506, 1.0] (POLYGON ((-71.47344207763672 42.3003084448852...
6 [0.970904490829, 0.959331880901, 0.0, 1.0] (POLYGON ((-71.26508331298828 42.3200411822557...
7 [1.0, 0.581699346405, 0.0, 1.0] (POLYGON ((-71.15048217773438 42.3333218460720...
从那里我制作我的folium地图:
import folium
# Picked location between Sudbury and Somerville:
maploc = folium.Map(location=[42.377157,-71.236088],zoom_start=11,tiles="Stamen Toner")
folium.GeoJson(gdf).add_to(maploc)
这创建了我漂亮的folium 地图,但多边形根本没有着色。如何让轮廓填充正确的颜色?并修复不透明度?
【问题讨论】:
感谢这个问题——它帮助我弄清楚如何在folium
中绘制GeoDataFrame
【参考方案1】:
我想我明白了。在我之前的代码中,polygon.get_facecolor() 返回范围为 0-1 的 RGBA 值列表。我添加了这个功能(修改自this帖子):
def convert_to_hex(rgba_color) :
red = str(hex(int(rgba_color[0]*255)))[2:].capitalize()
green = str(hex(int(rgba_color[1]*255)))[2:].capitalize()
blue = str(hex(int(rgba_color[2]*255)))[2:].capitalize()
if blue=='0':
blue = '00'
if red=='0':
red = '00'
if green=='0':
green='00'
return '#'+ red + green + blue
将其转换为十六进制字符串。那么:
gdf['RGBA'] = convert_to_hex(colors)
然后在folium中绘制颜色,我这样做:
maploc = folium.Map(location=[42.377157,-71.236088],zoom_start=10,tiles="Stamen Toner")
colors = []
folium.GeoJson(
gdf,
style_function=lambda feature:
'fillColor': feature['properties']['RGBA'],
'color' : feature['properties']['RGBA'],
'weight' : 1,
'fillOpacity' : 0.5,
).add_to(maploc)
这创造了一个非常漂亮的情节! (属性名称有点误导 - 它实际上不是 RGBA 值,而是十六进制字符串。)
【讨论】:
【参考方案2】:不是专家...我刚开始使用 folium 和 jupyter,遇到了类似的问题,但有线条。 你说你有 GeoJson 和多边形,颜色包含在我假设的 json 中。
style_function 可能会帮助你得到你想要的?
下面的例子是用这个页面产生的:http://geojson.io/ 我所要做的就是与 style_function 进行“映射”。 也可以使用自定义函数,参见: https://github.com/python-visualization/folium/blob/master/examples/Colormaps.ipynb
import folium
geoJsonData =
"features": [
"geometry":
"coordinates": [
[
12.98583984375,
56.70450561416937
],
[
14.589843749999998,
57.604221411628735
],
[
13.590087890625,
58.15331598640629
],
[
11.953125,
57.955674494979526
],
[
11.810302734375,
58.76250326278713
]
],
"type": "LineString"
,
"properties":
"stroke": "#fc1717",
"stroke-opacity": 1,
"stroke-width": 2
,
"type": "Feature"
,
"geometry":
"coordinates": [
[
14.9468994140625,
57.7569377956732
],
[
15.078735351562498,
58.06916140721414
],
[
15.4302978515625,
58.09820267068277
],
[
15.281982421875002,
58.318144965188246
],
[
15.4852294921875,
58.36427519285588
]
],
"type": "LineString"
,
"properties":
"stroke": "#1f1a95",
"stroke-opacity": 1,
"stroke-width": 2
,
"type": "Feature"
],
"type": "FeatureCollection"
m = folium.Map(location=[ 56.7, 12.9], zoom_start=6)
folium.GeoJson(geoJsonData,
style_function=lambda x:
'color' : x['properties']['stroke'],
'weight' : x['properties']['stroke-width'],
'opacity': 0.6,
'fillColor' : x['properties']['fill'],
).add_to(m)
m
git hub 上的folium 源代码也包含几个不错的示例:https://github.com/python-visualization/folium/tree/master/examples 在这里您可以找到可以使用的选项:http://leafletjs.com/reference.html#path-options
希望这能让你前进!
【讨论】:
【参考方案3】:我还没有足够的声誉点来发表评论,所以这是一个单独的答案,以澄清edub 所写的已接受答案。
Matplotlib 已经有了 colors.to_hex() 方法:
import matplotlib.colors as cl
colors = [cl.to_hex(c) for c in colors]
这将替换已接受答案中的 convert_to_hex() 方法。
【讨论】:
请注意,虽然您可能还没有足够的声望来发表评论,但如有必要,您仍然可以编辑其他用户的帖子以包括澄清。 我知道您不是制定此政策的人,但在我仍然无法评论他们的答案时,我编辑其他人的答案似乎不合时宜。我不明白为什么这是事情的顺序。 我知道,这有点傻,但这是为了防止无关的或对话的 cmets(如添加“+1”或“thanks!!!” cmets)和垃圾邮件,以及新用户的编辑在公开之前由社区进行同行评审,因此那里有一层 cmets 没有的保护。一旦您获得 5 个声望,您可以在 Meta Stack Overflow 上与更广泛的社区讨论此问题,您可以通过几个批准的编辑或一个赞成的问题/答案来做到这一点。 我的意思是,我已经使用 *** 超过 2 年了,每天多次。在我参与的所有其他社区中,我的声望点数要少得多。它说明了很多,我还没有评论一个人如何在这个特定网站上获得声誉点所需的 5 个声誉点。以上是关于在 folium 中使用地理数据框绘制彩色多边形的主要内容,如果未能解决你的问题,请参考以下文章
如何用 folium 绘制地图并在 python 中的地图旁边放置条形图?