从 python 构建交互式地图
Posted
技术标签:
【中文标题】从 python 构建交互式地图【英文标题】:Build interactive map from python 【发布时间】:2018-01-22 11:58:40 【问题描述】:我正在尝试构建显示交互式地图的网页(占页面的 100%),我在其中显示带有信息的点或线。 Plotly 似乎非常适合这一点,我真的很喜欢它的可视化,但是它不支持内置的 Open Street Map 等地图,它为此使用了 Mapbox。我对 Mapbox 没有任何反对意见,但据我所知,它可以免费获得一定数量的视图(当它使用 OSM 时)。
简单地说:有没有一种简单(作为开源和免费使用)的方式使用python来构建这样一个带有显示信息的地图的网页?
【问题讨论】:
你不能只更改图块源,以便它使用 OSM 的图块服务器而不是 MapBox' 吗?另请注意,OSM 服务器也有 tile usage policy。如果您有太多请求,那么您必须运行自己的磁贴服务器。 谢谢,我不知道 OSM 服务器策略的限制。并非接近限制,该网页每周可能仅被 10 或 20 人使用几次。在那种情况下,我也可以使用 MapBox,但是在使用 MapBox 时我也可以将输出绘制为 html 吗?如果我确实想更改磁贴服务器,我该怎么做? 不幸的是,我不知道如何为 plotly 配置 tile 源,我从未使用过它。 【参考方案1】:确实有!您可以在没有情节的情况下使用 Mapbox GL JS。这里有 html 代码示例,可以为您创建这些全尺寸地图。它们可以是卫星地图,也可以只是一张普通的地图。
画线: https://docs.mapbox.com/mapbox-gl-js/example/geojson-line/
在点击时创建一个弹出窗口: https://docs.mapbox.com/mapbox-gl-js/example/popup-on-click/
【讨论】:
最好在这里说明问题并给出一些代码示例,而不是仅仅将链接粘贴到外部服务。【参考方案2】:您确实可以在 Plotly 和 Dash 中不受限制地免费使用 OSM 地图或 Mapbox API 帐户,请参阅https://plotly.com/python/mapbox-layers/:
layout.mapbox.style 中的基础地图
layout.mapbox.style 可接受的值是以下之一:
“white-bg”生成一个空白画布,导致没有外部 HTTP 请求 “open-street-map”、“carto-positron”、“carto-darkmatter”、“stamen-terrain”、“stamen-toner”或“stamen-watercolor”产量地图由来自的光栅图块组成各种不需要注册或访问令牌的公共磁贴服务器 “basic”、“streets”、“outdoors”、“light”、“dark”、“satellite”或“satellite-streets”生成由 Mapbox 服务中的矢量图块组成的地图,并且确实需要 Mapbox 访问权限令牌或本地 Mapbox 安装。 Mapbox 服务样式 URL,需要 Mapbox 访问令牌或本地 Mapbox 安装。 https://docs.mapbox.com/mapbox-gl-js/style-spec/ 中定义的 Mapbox 样式对象
这是来自同一绘图文档的代码示例,该文档使用 OSM 底图,但没有任何身份验证令牌:
import pandas as pd
us_cities = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/us-cities-top-1k.csv")
import plotly.express as px
fig = px.scatter_mapbox(us_cities, lat="lat", lon="lon", hover_name="City", hover_data=["State", "Population"],
color_discrete_sequence=["fuchsia"], zoom=3, height=300)
fig.update_layout(mapbox_style="open-street-map")
fig.update_layout(margin="r":0,"t":0,"l":0,"b":0)
fig.show()
至于建一个实际的网站,我推荐使用 Dash,它是一个与 plotly 很好集成的网络服务器。
【讨论】:
以上是关于从 python 构建交互式地图的主要内容,如果未能解决你的问题,请参考以下文章