Folium 绘图 GeoJson 根据自定义值在多边形中填充颜色

2024-01-07

我有带有与标识符相关联的纬度/经度值的多边形GeoDataFrame如下所示。考虑一个有两个标识符的例子A and B, 多边形A有三点并且B有四个点,它们的纬度/经度值如下所示。对应于每个点(纬度/经度),我还有一个关联的数值,如最后一列所示。

id    geometry                                                                         values
A   POLYGON((lat_A_1 long_A_1, lat_A_2 long_A_2, lat_A_3 long_A_3))                    10,12,13
B   POLYGON((lat_B_1 long_B_1, lat_B_2 long_B_2, lat_B_3 long_B_3, lat_B_4 long_B_4))  4,8,16,20

我迭代 GeoDataFrame 并使用此代码在地图上绘制这些多边形

    geo_j = folium.GeoJson(data=geo_j,
                           style_function={ 
                               'fillColor': 'blue'
                           })

有没有办法可以根据列使用自定义颜色图填充多边形values在 GeoDataFrame 中,例如红色代表 0-5,蓝色代表 6-10,绿色代表 11-20。如何才能做到这一点?


  • 首先获取一些多边形并定义每个点的值(生成 MWE 样本数据集)
  • 这意味着与多边形关联的值与多边形中的点一样多。您请求解决方案使用folium用自定义颜色图值填充多边形。这意味着您需要一个函数将所有这些值同化为多边形的单个值(颜色)。我用过mode,最常见的值。这可以是平均值、中位数或任何其他函数。
  • 那么解决方案就变得简单了,就是folium.GeoJson()使用并适当构建风格_功能
  • 扩展答案。您可以将多边形分割成更小的多边形,并将子多边形的颜色与点相关联。folium产量不变(包括iso_a3)只是为了更容易查看
  • shapley提供了两种分割多边形的方法https://shapely.readthedocs.io/en/stable/manual.html#shapely.ops.triangulate https://shapely.readthedocs.io/en/stable/manual.html#shapely.ops.triangulate。已经发现voronoi更有效

生成 MWE 数据

# some polygons
gdf = gpd.read_file(gpd.datasets.get_path("naturalearth_lowres")).loc[lambda d: d["iso_a3"].isin(["BEL", "LUX", "NLD", "DEU", "AUT"]), ["geometry"]]

# comma separated values column... between 0 and 20...
gdf["values"] = gdf.geometry.apply(lambda p: ",".join([str(int(sum(xy)) % 20) for xy in p.exterior.coords]))
# id column
gdf["id"] = list("ABCDEFGHIJ")[0 : len(gdf)]
gdf = gdf.set_index("id", drop=False)

data

                                   geometry                                   values id
id                                                                                     
A   POLYGON ((16.97967 48.12350, 16.9037...  5,4,4,4,3,2,1,1,0,19,19,18,17,17,16,...  A
B   POLYGON ((14.11969 53.75703, 14.3533...  7,7,7,7,6,6,6,5,5,4,4,3,2,2,2,2,2,1,...  B
C   POLYGON ((6.04307 50.12805, 6.24275 ...                     16,16,15,15,15,15,16  C
D   POLYGON ((6.15666 50.80372, 6.04307 ...  16,16,15,15,14,14,13,13,13,13,14,14,...  D
E   POLYGON ((6.90514 53.48216, 7.09205 ...  0,0,19,18,17,16,16,16,15,14,14,15,17...  E

solution

import statistics as st
import branca.colormap
import geopandas as gpd
import folium

m = folium.Map(
    location=[
        sum(gdf.geometry.total_bounds[[1, 3]]) / 2,
        sum(gdf.geometry.total_bounds[[0, 2]]) / 2,
    ],
    zoom_start=5,
    control_scale=True,
)

# style the polygons based on "values" property
def style_fn(feature):
    cm = branca.colormap.LinearColormap(["mistyrose", "tomato", "red"], vmin=0, vmax=20)
    most_common = st.mode([int(v) for v in feature["properties"]["values"].split(",")])
    ss = {
        "fillColor": cm(most_common),
        "fillOpacity": 0.8,
        "weight": 0.8,
        "color": cm(most_common),
    }
    return ss


folium.GeoJson(
    gdf.__geo_interface__,
    style_function=style_fn,
    tooltip=folium.features.GeoJsonTooltip(["id", "values"]),
).add_to(m)

m

将多边形分割成多个部分

import statistics as st
import branca.colormap
import geopandas as gpd
import folium
import shapely.geometry
import shapely.ops
import pandas as pd

# some polygons
# fmt: off
gdf = gpd.read_file(gpd.datasets.get_path("naturalearth_lowres")).loc[lambda d: d["iso_a3"].isin(["BEL", "LUX", "NLD", "DEU", "AUT","POL"]), ["geometry", "iso_a3"]]

# comma separated values column... between 0 and 20...
gdf["values"] = gdf.geometry.apply(lambda p: ",".join([str(int(sum(xy)) % 20) for xy in p.exterior.coords]))
# id column
gdf["id"] = list("ABCDEFGHIJ")[0 : len(gdf)]
gdf = gdf.set_index("id", drop=False)
# fmt: on


def sub_polygons(r, method="voronoi"):
    g = r["geometry"]
    # split into sub-polygons
    if method == "voronoi":
        geoms = shapely.ops.voronoi_diagram(g).geoms
    elif method == "triangulate":
        geoms = [
            p
            for p in shapely.ops.triangulate(g)
            if isinstance(p.intersection(g), shapely.geometry.Polygon)
        ]
    else:
        raise "invalid polygon ops method"
        
    # clip sub-geometries
    geoms = [p.intersection(g) for p in geoms]
    vs = r["values"].split(",")
    vr = []
    # order or sub-polygons and points are differenct.  use value from point
    # in sub-polygon
    for vg in geoms:
        for i, xy in enumerate(g.exterior.coords):
            if not shapely.geometry.Point(xy).intersection(vg).is_empty:
                break
        vr.append(vs[i])
    return [{**r.to_dict(), **{"geometry": g, "values": v}} for g, v in zip(geoms, vr)]


gdf2 = gpd.GeoDataFrame(
    gdf.apply(sub_polygons, axis=1, method="voronoi").explode().apply(pd.Series)
)


m = folium.Map(
    location=[
        sum(gdf.geometry.total_bounds[[1, 3]]) / 2,
        sum(gdf.geometry.total_bounds[[0, 2]]) / 2,
    ],
    zoom_start=5,
    control_scale=True,
)

# style the polygons based on "values" property
def style_fn(feature):
    cm = branca.colormap.LinearColormap(["mistyrose", "tomato", "red"], vmin=0, vmax=20)
    most_common = st.mode([int(v) for v in feature["properties"]["values"].split(",")])
    ss = {
        "fillColor": cm(most_common),
        "fillOpacity": 0.8,
        "weight": 0.8,
        "color": cm(most_common),
    }
    return ss


folium.GeoJson(
    gdf2.__geo_interface__,
    style_function=style_fn,
    tooltip=folium.features.GeoJsonTooltip(["id", "values", "iso_a3"]),
).add_to(m)

m

与特征组

m = folium.Map(
    location=[
        sum(gdf.geometry.total_bounds[[1, 3]]) / 2,
        sum(gdf.geometry.total_bounds[[0, 2]]) / 2,
    ],
    zoom_start=5,
    control_scale=True,
)

for g, d in gdf2.groupby(level=0):
    fg = folium.map.FeatureGroup(name=g)
    folium.GeoJson(
        d.__geo_interface__,
        style_function=style_fn,
        tooltip=folium.features.GeoJsonTooltip(["id", "values", "iso_a3"]),
    ).add_to(fg)
    fg.add_to(m)
    
folium.LayerControl().add_to(m)    
m
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Folium 绘图 GeoJson 根据自定义值在多边形中填充颜色 的相关文章

随机推荐

  • 无法通过 ADB 连接到我的 Android 设备

    抱歉问了这个菜鸟问题 我在使用网络解决这个问题时遇到了麻烦 我试图通过 adb 将我的设备连接到我的电脑来调试我的应用程序 我的设备已植根 Adb 调试已启用 我下载了一个 adb 运行应用程序并启动了 ADB 现在我正在尝试 adb co
  • sched_getcpu() 相当于 OS X 吗?

    在 OS X 上 有没有办法找出线程正在哪个 CPU 上运行 Linux 的等效函数是调度获取CPU http man7 org linux man pages man3 sched getcpu 3 html 获取当前处理器编号 http
  • 缓冲输入如何工作

    下一个程序中的输入 使用 DOS BufferedInput 函数 0Ah 工作正常 但是当我要求显示输出时 DOS 根本不显示任何内容 这怎么可能 ORG 256 mov dx msg1 mov ah 09h DOS WriteStrin
  • zsh:权限被拒绝:gam

    我在安装了 Oh My ZSH 的 macOS 10 12 上使用 ZSH 我最近安装了GAM https github com jay0lee GAM在我的计算机上使用提供的安装脚本bash lt curl s S L https git
  • glVertexAttribPointer 引发不可能的 GL_INVALID_OPERATION?

    我已将错误范围缩小到此 OpenGL 调用 glVertexAttribPointer var vertex 4 GL FLOAT GL FALSE 0 0 前面没有错误 并且有一个GL INVALID OPERATION之后出现错误 我的
  • CSS如何正确使用em代替像素?

    我想尝试将我的设计从像素转换为 em 我已经阅读了很多教程 我将把它留在那里 以此为基础开始 body font size 62 5 line height 1 4 现在这就是我迷路的地方 我应该定义我的font size像这样 div w
  • 使用 iframe 时更改地址栏

    有没有一种方法可以使用 iframe 但在单击 iframe 内的内容时仍然可以将地址栏更改为页面的实际内容 我想在页面顶部有一个带有音乐播放器的水平栏 允许在浏览网站时播放音乐 但我也希望人们能够轻松地为这些页面添加书签 我已经搜索过 但
  • Visual Studio 2013远程调试,自动部署?

    当我尝试使用 Windows 应用商店应用程序 Metro 应用程序 进行远程调试时 非常简单 在 开始 下拉列表中 我可以选择一台远程计算机 然后VS构建项目并自动将可执行文件部署到远程计算机并运行它 感觉就像是本地调试一样 现在我想尝试
  • 为什么没有 lubridate:::update 函数?

    正如标题所说 为什么没有这个功能呢 或者以不同的方式 函数的类型是什么 当我打字时 update我从那里得到一些东西stats包 但有一个 lubridate 函数 如上所述第 7 页 似乎还有一个lubridate update Date
  • 拯救 ActionController::UnknownFormat 免于引发异常

    我正在努力做到这一点ActionController UnknownFormat不会在生产中引发异常报告 我正在使用 Rails 4 并认为这样的东西可以解决问题 但它似乎没有什么区别 应用程序 rb config action dispa
  • Codeigniter 无法使用 join 方法从数据库表中删除行

    我想从 table1 中删除 user id 5 的那些行 但我应该检查这些帖子是否 table2 中的 title title1 我使用 Codeigniter 在尝试删除时收到此错误 除非包含 where 或 like 子句 否则不允许
  • PHPExcel 在 AWS 上运行代码时写入垃圾字符。

    我面临 PHPExcel excel 下载代码的问题 下载代码在一台服务器 netcore 服务器 上运行 但同一组代码在 AWS 服务器上不起作用 任何人都可以帮助我找出确切的问题是什么 以下是phpexcel下载代码 error rep
  • 关闭 tomcat 服务器时无法加载 org.apache.hadoop.util.ShutdownHookManager

    我有一个在 tomcat 上运行的简单 Web 应用程序 该 Web 应用程序读取文件并将其写入 HDFS 我面临的问题是每次我使用以下命令停止服务器时 bin shutdown sh 我收到无法加载 hadoop shutdownHook
  • Resharper 智能感知不适用于 XAML

    Resharper 智能感知在 XAML 中似乎不适用于我 我的 Xaml 看起来像
  • 复制 Google Sheets 中的模板并自动授权脚本

    我见过类似的问题 但没有一个有 A 我可以使用的答案或 B 相同的目标 开始 我有一个 Google 表格模板 称之为 处理 并绑定了一个脚本 当另一个脚本运行 copyTemplate gs 时 它会根据唯一的 ID 号创建一个新的处理副
  • localStorage 按值排序

    我已将一些数据放入 localStorage 并且我想检索数组中的键名 并按值排序 法国 0意大利 1英格兰 2德国 3 etc function getCountries use strict var returnArray for va
  • ADO.NET:为所有 VarChar 参数的 SqlParameter.Size 指定 -1 是否安全?

    我们有一个现有的 C 代码体 可以在许多地方调用参数化的即席 SQL Server 查询 我们从不指定 SqlParameter Size 并且有记录表明 在这种情况下 SqlParameter 类从参数值推断大小 我们最近才意识到由此产生
  • 使用整数列在数据库中存储美国邮政编码是个好主意吗?

    乍一看 我似乎有两种基本的存储选择邮政编码 http en wikipedia org wiki ZIP code在数据库表中 文本 可能是最常见的 即char 5 or varchar 9 支持 4扩展 数字 即 32 位整数 如果我们假
  • 在 vaadin 中调整 CSS 变化的方法是什么?

    我正在努力应对 vaadin 中的一些细微布局更改 这些更改必须在 Java 和 Css 端完成 每当我需要调整某个组件的布局 例如 padding top 背景颜色或粗体文本 时 我也需要通过 Java 代码设置样式 userLink s
  • Folium 绘图 GeoJson 根据自定义值在多边形中填充颜色

    我有带有与标识符相关联的纬度 经度值的多边形GeoDataFrame如下所示 考虑一个有两个标识符的例子A and B 多边形A有三点并且B有四个点 它们的纬度 经度值如下所示 对应于每个点 纬度 经度 我还有一个关联的数值 如最后一列所示