在 Plotly Density_Mapbox 上添加 GeoJSON 等高线作为图层

2024-05-09

我想在上面添加天气轮廓plotly density_mapbox地图,但我不确定必要的步骤。

首先,我创建了一个matplotlib等值线图以可视化数据。

然后,我用了geojsoncontour创建一个geojson文件来自所说matplotlib等高线的等高线图。

我现在想做的是在同一张地图上绘制等高线density_mapbox.

geojson可以找到包含数据的.csv文件here https://github.com/jkiefn1/Contours_and_plotly.

对于 .csv 文件,“Rand_Data”是进入density_mapbox绘图中,“Rain_in”是用于生成等值线的数据。

数据链接:https://github.com/jkiefn1/Contours_and_plotly https://github.com/jkiefn1/Contours_and_plotly

创建地图盒:

# Create the static figure
fig = px.density_mapbox(df
                        ,lat='lat'
                        ,lon='long'
                        ,z='Rand_Data'
                        ,hover_data={
                                     'lat':True # remove from hover data
                                     ,'long':True # remove from hover data
                                     ,col:True
                                    }
                        ,center=dict(lat=38.5, lon=-96)
                        ,zoom=3
                        ,radius=30
                        ,opacity=0.5
                        ,mapbox_style='open-street-map'
                        ,color_continuous_scale='inferno'
                       )

fig.show()

创建 matplotlib 等高线图并生成 geojson 文件

# Load in the DataFrame
path = r'/Users/joe_kiefner/Desktop/Sample_Data.csv'
df = pd.read_csv(path, index_col=[0])
data = []

# Define rain levels to be contours in geojson
levels = [0.25,0.5,1,2.5,5,10]

colors = ['royalblue',  'cyan',  'lime',  'yellow', 'red']
vmin   = 0
vmax   = 1
cm     = branca.colormap.LinearColormap(colors, vmin=vmin, vmax=vmax).to_step(len(levels))


x_orig = (df.long.values.tolist())
y_orig = (df.lat.values.tolist())
z_orig = np.asarray(df['Rain_in'].values.tolist())


x_arr          = np.linspace(np.min(x_orig), np.max(x_orig), 500)
y_arr          = np.linspace(np.min(y_orig), np.max(y_orig), 500)
x_mesh, y_mesh = np.meshgrid(x_arr, y_arr)

xscale = df.long.max() - df.long.min()
yscale = df.lat.max() - df.lat.min()

scale = np.array([xscale, yscale])


z_mesh = griddata((x_orig, y_orig), z_orig, (x_mesh, y_mesh), method='linear')


sigma = [5, 5]
z_mesh = sp.ndimage.filters.gaussian_filter(z_mesh, sigma, mode='nearest')

# Create the contour
contourf = plt.contourf(x_mesh, y_mesh, z_mesh, levels, alpha=0.9, colors=colors, 
                        linestyles='none', vmin=vmin, vmax=vmax)

# Convert matplotlib contourf to geojson
geojson = geojsoncontour.contourf_to_geojson(
    contourf=contourf,
    min_angle_deg=3,
    ndigits=2,
    unit='in',
    stroke_width=1,
    fill_opacity=0.3)
d = json.loads(geojson)
len_features=len(d['features'])
if not data:
    data.append(d)
else:
    for i in range(len(d['features'])):
         data[0]['features'].append(d['features'][i])
            
with open('/path/to/Sample.geojson', 'w') as f:
   dump(geojson, f)

  • there are two core options
    1. 添加为图层https://plotly.com/python/mapbox-layers/ https://plotly.com/python/mapbox-layers/
    2. 添加为等值线描记https://plotly.com/python/mapbox-county-choropleth/ https://plotly.com/python/mapbox-county-choropleth/
    3. 图层图例- 与...一样layers通过向图形添加额外的痕迹来添加创建图例的选项
  • 这两个选项的编码如下。改变值OPTION在它们之间切换
  • layers表示没有图例或悬停文本
  • 等值线图这些都存在,被感动colorbar所以它不会与图例重叠。更多图例和悬停文本的美化需要...
import json, requests
import pandas as pd
import geopandas as gpd
import plotly.express as px

txt = requests.get(
    "https://raw.githubusercontent.com/jkiefn1/Contours_and_plotly/main/Sample.geojson"
).text
js = json.loads(json.loads(txt))

df = pd.read_csv(
    "https://raw.githubusercontent.com/jkiefn1/Contours_and_plotly/main/Sample_Data.csv"
)

col = "Rand_Data"
fig = px.density_mapbox(
    df,
    lat="lat",
    lon="long",
    z="Rand_Data",
    hover_data={
        "lat": True,  # remove from hover data
        "long": True,  # remove from hover data
        col: True,
    },
    center=dict(lat=38.5, lon=-96),
    zoom=3,
    radius=30,
    opacity=0.5,
    mapbox_style="open-street-map",
    color_continuous_scale="inferno",
)

OPTION = "layers-legend"
if OPTION[0:6]=="layers":
    fig.update_traces(legendgroup="weather").update_layout(
        mapbox={
            "layers": [
                {
                    "source": f,
                    "type": "fill",
                    "color": f["properties"]["fill"],
                    "opacity": f["properties"]["fill-opacity"],
                }
                for f in js["features"]
            ],
        }
    )
    
    if OPTION=="layers-legend":
        # create a dummy figure to create a legend for the geojson
        dfl = pd.DataFrame(js["features"])
        dfl = pd.merge(
            dfl["properties"].apply(pd.Series),
            dfl["geometry"].apply(pd.Series)["coordinates"].apply(len).rename("len"),
            left_index=True,
            right_index=True,
        )
        figl = px.bar(
            dfl.loc[dfl["len"].gt(0)],
            color="title",
            x="fill",
            y="fill-opacity",
            color_discrete_map={cm[0]: cm[1] for cm in dfl.loc[:, ["title", "fill"]].values},
        ).update_traces(visible="legendonly")

        fig.add_traces(figl.data).update_layout(
            xaxis={"visible": False}, yaxis={"visible": False}, coloraxis={"colorbar":{"y":.25}}
        )
else:
    gdf = gpd.GeoDataFrame.from_features(js)
    gdf = gdf.loc[~gdf.geometry.is_empty]
    cmap = {
        list(d.values())[0]: list(d.values())[1]
        for d in gdf.loc[:, ["title", "fill"]].apply(dict, axis=1).tolist()
    }
    fig2 = px.choropleth_mapbox(
        gdf,
        geojson=gdf.geometry,
        locations=gdf.index,
        color="title",
        color_discrete_map=cmap,
        opacity=.3
    )
    fig.add_traces(fig2.data).update_layout(coloraxis={"colorbar":{"y":.25}})
    
    
fig

layers

traces

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Plotly Density_Mapbox 上添加 GeoJSON 等高线作为图层 的相关文章

随机推荐

  • 将多个身份验证提供商链接到一个帐户

    我已经实现了 Facebook 和 Google 登录 但 FireBase 文档称 如果同一用户首先使用 Facebook 注册 然后尝试使用 Google 登录 使用相同的电子邮件 这将导致错误 所以我按照文档并尝试配置帐户关联 但我不
  • 在 Orchard 中设置唯一的主体类和 ID

    有没有办法在 Orchard 中为每页设置唯一的正文类和 ID 我希望能够在 编辑页面 部分控制这些 例如 主页的正文 ID 为 home 关于页面的正文 ID 为 about 等 并且 如果 about 页面下有子页面 这些页面将具有 a
  • Tabcontrol 中的 SelectedIndex 不变 - 调度程序问题

    为什么在我设置 SelectedIndex 0 后 我随后 而不是响应 得到使用 SelectedIndex 4 调用的事件处理程序 我追踪到对调度程序的调用 但我不明白为什么 计划如下 我有一个页面 其中包含带有各种选项卡的选项卡控件 当
  • IE6 CSS 显示:表格修复?

    我正在开发一个网络应用程序 不幸的是它必须与有史以来最糟糕的软件一起工作 是的 即 ie6 我真的很喜欢CSSdisplay table and display table cell属性 但当然它在 ie 中不起作用 有没有人找到解决这个问
  • 如何实现urllib2.urlopen的超时控制

    如何在Python中实现对urllib2 urlopen的控制 我只是想监控如果5秒内没有xml数据返回 则切断此连接并重新连接 我应该使用一些计时器吗 谢谢 urllib2 urlopen http www example com tim
  • 如何将资源文件添加到 Visual Studios 以便在“选择资源”对话框中可见?

    在 Visual Studio 中 您可以使用 GUI 编辑器 又名 设计器 编辑按钮控件的图像 我想将我的资源分成两部分 resx文件放置在项目的 Properties 文件夹中 我的问题是 Visual Studio 中的 选择资源 对
  • Mat 分页器更改工具提示位置

    我正在尝试定位工具提示mat paginator更靠近分页按钮 目前 工具提示距离太远 如下所示 我尝试更新 cdk overlay pane and mat tooltip panel课程但对我不起作用 任何积分都受到高度赞赏 需要深入组
  • 为 RStudio Server 1.0.44 配置日志目录

    我在 CentOS 7 上运行 RStudio Server 1 0 44 根据文档 https support rstudio com hc en us articles 200554766 RStudio Server Applicat
  • Apache POI - FileInputStream 工作,文件对象失败(NullPointerException)

    我尝试将所有工作表从一个工作簿复制到另一工作簿 问题是 如果我通过 FileInputStream 读取工作簿 它可以正常工作 但它不适用于文件对象 考虑以下方法 import java io BufferedReader import j
  • 在 PCL 中使用 System.Net.Sockets(.Net 4.5 + 电话 8)

    我现有的 Net 库已经适用于 Net 4 5 和 Windows Phone 8 现在我想将其转换为可移植类库 突然我无法使用System Net Sockets不再了 我只检查了 Net 4 5和Windows Phone 8 未选择X
  • 删除所有值比第二高值低 5 倍的记录

    我有一个表 价格 有两个字段 代码 字符 和价格 小数 我需要查找具有相同代码 价格比两个最高价格低 5 倍或更少的所有记录 例如 在这种情况下 我希望删除 id 1 id code price 1 1001 10 2 1001 101 3
  • sql/mysql 过滤器仅包含最大值

    我有一个像这样的结果集 ID name myvalue 1 A1 22 2 A2 22 3 A3 21 4 A4 33 5 A5 33 6 A6 10 7 A7 10 8 A8 10 9 A9 5 我想要的是仅包含包含可用的最高 myval
  • 仅当 id 不存在时插入

    好的 我们有一个 Phonegap 应用程序 其表格设置如下 tblTest actualid INTEGER PRIMARY KEY id INTEGER name TEXT 实际 ID 是设备的唯一 ID 该 ID 维护在服务器端数据库
  • tf.exe 撤消其他用户的挂起更改

    我希望将我们的 TFS 项目迁移到另一台服务器 在执行此操作之前 我想检查所有待处理的更改 撤消它们 或告诉检查人员检查其全部内容 并将项目锁定在旧服务器上 为此 我需要撤消不再存在的非常旧的工作区中的签出 我现在正在寻找使这项工作发挥作用
  • 关于android Sqlite在多进程情况下的安全性

    在我的应用程序中 存在多个进程 并且在每个进程中 我需要访问同一个SQLite数据库 当然 这意味着超过2个线程 所以我不仅担心SQLite的线程安全性 还担心SQLite的线程安全性 还有过程安全 这种情况的一种解决方案是使用内容提供者
  • Magento 1.8 - 高级搜索不起作用

    我在最新版本的 magento 中发现了一个奇怪的错误 高级搜索工具无法正常工作 我做了什么 安装 magento 的新副本 在管理页面添加了一个名为 测试 1 的产品 重新索引全部 清除所有缓存 At the frontend page
  • 如何将故事板连接到视图控制器

    在新的 xcode 5 中 如何在界面生成器中使用下拉菜单将故事板视图控制器连接到类 现在这是如何完成的 除非我误解了你的要求 否则它仍然存在 以下是将自定义视图控制器类分配给视图控制器的步骤 在左侧场景列表中选择您的视图控制器 选择右侧的
  • 使用 javascript 更改整个 CSS 类的样式

    有没有办法使用 javascript 更改 CSS 类的属性 p class fool p
  • SSL 握手警报:升级到 Java 1.7.0 后出现 unrecognized_name 错误

    我今天从 Java 1 6 升级到 Java 1 7 从那时起 当我尝试通过 SSL 与我的网络服务器建立连接时 就会发生错误 javax net ssl SSLProtocolException handshake alert unrec
  • 在 Plotly Density_Mapbox 上添加 GeoJSON 等高线作为图层

    我想在上面添加天气轮廓plotly density mapbox地图 但我不确定必要的步骤 首先 我创建了一个matplotlib等值线图以可视化数据 然后 我用了geojsoncontour创建一个geojson文件来自所说matplot