【问题标题】:Plotting polygons on mapbox with plotly使用 plotly 在 mapbox 上绘制多边形
【发布时间】:2019-10-05 15:35:12
【问题描述】:

我正在尝试使用 scattermapbox 绘制 geojson 几何图形。

这段代码成功地将 geopandas 中的数据转换为 plotly 使用:

from plotly.offline import download_plotlyjs, init_notebook_mode, 
plot, iplot
import plotly.graph_objs as go

mapbox_access_token = 'mykey'

import json

from_json = geopandas_gdf.to_json()
geoJSON = json.loads(from_json)

pts=[]#list of points defining boundaries of polygons
for  feature in geoJSON['features']:
    if feature['geometry']['type']=='Polygon':
        pts.extend(feature['geometry']['coordinates'][0])    
        pts.append([None, None])#mark the end of a polygon   

    elif feature['geometry']['type']=='MultiPolygon':
        for polyg in feature['geometry']['coordinates']:
            pts.extend(polyg[0])
            pts.append([None, None])#end of polygon
    else: raise ValueError("geometry type irrelevant for map") 

X, Y=zip(*pts)

我可以使用以下代码将这些数据绘制在 blanc 图形上:

axis_style=dict(showline=False, 
            mirror=False, 
            showgrid=False, 
            zeroline=False,
            ticks='',
            showticklabels=False)
layout=dict(title='map',
            width=700, height=700, 
            autosize=False,
            xaxis=axis_style,
            yaxis=axis_style,
            hovermode='closest')
fig=dict(data=data, layout=layout)
plot(fig, filename='map')

但我无法在 scattermapbox 上绘制它。像这样尝试:

data = [
go.Scattermapbox(
    lat=X,
    lon=Y,
    line = go.scattermapbox.Line(width=5,
                                 color='red'))
    ]

layout = go.Layout(
autosize=True,
hovermode='closest',
mapbox=go.layout.Mapbox(
    accesstoken=mapbox_access_token,
    bearing=0,
    center=go.layout.mapbox.Center(
        lat=53,
        lon=0
    ),
    pitch=0,
    zoom=5
    ),
)

fig = go.Figure(data=data, layout=layout)
plot(fig, filename='Montreal Mapbox')

谢谢!

【问题讨论】:

  • 解决了上述问题(请参阅下面的答案)我有其他问题:如何提供来自 json 的数据以悬停?

标签: python plotly


【解决方案1】:

我已经设法通过以下方式做到这一点:

layout = go.Layout(
    height=1500,
    autosize=True,
    hovermode='closest',
    mapbox=dict(
        layers=[
            dict(
                sourcetype = 'geojson',
                source = geoJSON,
                type = 'fill',
                color = 'rgba(163,22,19,0.8)'
            )
        ],
        accesstoken=mapbox_access_token,
        bearing=0,
        center=dict(
            lat=53,
             lon=0
        ),
        pitch=0,
        zoom=5.2,
        style='light'
     ),
)

但随之而来的另一个问题是:如何从 json 中提供数据来悬停?

【讨论】:

  • 您究竟是如何在 mapbox 中绘制自己的多边形的?我似乎无法从您的代码 sn-ps 中拼凑出来...您可以编辑您的回复以帮助其他人解决同样的问题吗?
【解决方案2】:

回答您的第二个问题

使用传递给绘图的data 内的customdata 属性提供来自JSON 的数据以悬停。

另外:能否请您路由一个通用的 json 数据集,以便其他人可以轻松运行您的代码块?

链接到customdata属性:https://plot.ly/python/reference/#scatter-customdata

Else,您可以使用textmode='markers + text' 在悬停时显示来自text 属性的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-02
    • 2022-11-30
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多