在 Plotly Python API 中控制 MapBox 范围

rsg*_*gny 5 python mapbox plotly-dash

Plotly Python API可以使用MapBox(ScatterMapbox)制作漂亮的交互式地图,但无法控制地图范围。例如,如果您想要将图像保存为 PDF 或 PNG 文件并且不希望用户以交互方式缩放,那么能够控制地图范围就很重要。

我面临的问题是没有办法直接表明您只想查看某个区域。例如,无法表明您希望地图仅显示佛罗里达州。

但是,您可以设置地图的中心和缩放级别。当您知道想要可见的框的纬度/经度坐标并且知道中心坐标时,是否可以使用一个公式来定义缩放级别?

例如,如果我希望地图以坐标(center_lat,center_long)为中心并进行缩放,以便可见部分具有西南坐标(sw_lat,sw_long)和东北坐标(ne_lat,ne_long),那么MapBox ZOOM是什么我必须提供的级别?

我意识到该公式可能取决于地图投影,这就是为什么我具体使用 MapBox 和 Plotly。此外,我在 SO 上看到过类似的问题,但这些问题似乎都与通过 JS 使用 MapBox 有关,而不是在 Plotly Python API 中,这使我很难将解决方案转化为我认为可以使用的东西。

jac*_*dbd 3

这是我为这个 Dash 应用程序所做的事情。

我创建了一个dict包含一些具有纬度、经度和缩放级别的区域。

regions = {
    'world': {'lat': 0, 'lon': 0, 'zoom': 1},
    'europe': {'lat': 50, 'lon': 0, 'zoom': 3},
    'north_america': {'lat': 40, 'lon': -100, 'zoom': 2},
    'south_america': {'lat': -15, 'lon': -60, 'zoom': 2},
    'africa': {'lat': 0, 'lon': 20, 'zoom': 2},
    'asia': {'lat': 30, 'lon': 100, 'zoom': 2},
    'oceania': {'lat': -10, 'lon': 130, 'zoom': 2},
}
Run Code Online (Sandbox Code Playgroud)

然后我将Graph对象置于使用 选定的区域的中心dropdown-region Dropdown

import plotly.graph_objs as go

@app.callback(
    output=Output('graph-geo', 'figure'),
    inputs=[Input('dropdown-map-style', 'value'),
            Input('dropdown-region', 'value')]
)
def _update_graph(map_style, region):

    layout = go.Layout(
        title='graph-title',
        mapbox=dict(
            accesstoken=mapbox_access_token,
            bearing=0,
            # center Graph object on region selected with 'dropdown-region'
            center=dict(
                lat=regions[region]['lat'],
                lon=regions[region]['lon'],
            ),
            pitch=0,
            zoom=regions[region]['zoom'],
            style=map_style,
        ),
    )
    data = go.Data([
        # data for the Graph object...
        go.Scattermapbox(...)
    ])
Run Code Online (Sandbox Code Playgroud)

完整代码在这里