使用切片提供程序时,设置散景图的缩放级别

时间:2017-07-21 14:18:15

标签: python gis bokeh

我按照这里的示例:http://bokeh.pydata.org/en/latest/docs/user_guide/geo.html#tile-providers

我有一个基本地图加载GeoJSON文件,其中包含多边形列表(已投射到Web Mercator EPSG:3857),因此我可以使用STAMEN_TONER作为切片提供程序。

from bokeh.io import output_file, show
from bokeh.plotting import figure
from bokeh.tile_providers import STAMEN_TONER, STAMEN_TERRAIN
from bokeh.models import Range1d, GeoJSONDataSource

# bokeh configuration for jupyter
from bokeh.io import output_notebook
output_notebook()

# bounding box (x,y web mercator projection, not lon/lat) 
mercator_extent_x = dict(start=x_low, end=x_high, bounds=None)
mercator_extent_y = dict(start=y_low, end=y_high, bounds=None)
x_range1d = Range1d(**mercator_extent_x)
y_range1d = Range1d(**mercator_extent_y)

fig = figure(
    tools='pan, zoom_in, zoom_out, box_zoom, reset, save', 
    x_range=x_range1d, 
    y_range=y_range1d, 
    plot_width=800, 
    plot_height=600
)
fig.axis.visible = False
fig.add_tile(STAMEN_TERRAIN)

# the GeoJSON is already in x,y web mercator projection, not lon/lat 
with open('/path/to/my_polygons.geojson', 'r') as f:
    my_polygons_geo_json = GeoJSONDataSource(geojson=f.read())

fig.multi_line(
    xs='xs', 
    ys='ys', 
    line_color='black', 
    line_width=1, 
    source=my_polygons_geo_json
)
show(fig)

但是我无法为图块设置默认缩放级别。我认为这可能是一个工具设置(http://bokeh.pydata.org/en/latest/docs/user_guide/tools.html),但在那里我找不到缩放功能的默认值。

如何设置图块缩放级别的默认值?

3 个答案:

答案 0 :(得分:1)

老问题,但回答是否有人会遇到同样的问题。设置地图的范围,这样您就可以在加载时放大所需的区域。以下巴布亚新几内亚的例子

p = figure(title="PNG Highlands Earthquake 7.5 Affected Villages",y_range=(-4.31509, -7.0341),x_range=( 141.26667, 145.56598))
p.xaxis.axis_label = 'longitude'
p.yaxis.axis_label = 'latitude'

enter image description here

答案 1 :(得分:0)

缩放“级别”的概念仅适用于GMapPlot,并且只是因为谷歌非常谨慎地控制地图的呈现,这就是他们提供的API。所有其他Bokeh图都具有明确的用户可设置的x_rangey_range属性。您可以将这些范围的startend设置为您想要的任何值,并且绘图将显示由这些边界定义的相应区域。

答案 2 :(得分:0)

我本人刚刚遇到了这个问题,并且找到了一个在大多数情况下都可以使用的好的解决方案。这需要确保正确投影数据和x_range / y_range(我使用了Proj的{​​{1}}和transform,但是我确定还有其他软件包可以正常工作) 。

导入模块:

pyproj

读入数据(由于我正在处理一个极其混乱的数据集,该数据集包含import pandas as pd import numpy as np from pyproj import Proj, transform import datashader as ds from datashader import transfer_functions as tf from datashader.bokeh_ext import InteractiveImage from datashader.utils import export_image from datashader.colors import colormap_select, Greys9, Hot, viridis, inferno from IPython.core.display import HTML, display from bokeh.plotting import figure, output_notebook, output_file, show from bokeh.tile_providers import CARTODBPOSITRON from bokeh.tile_providers import STAMEN_TONER from bokeh.tile_providers import STAMEN_TERRAIN from bokeh.embed import file_html from functools import partial output_notebook() 和坐标列中的损坏文本,因此我采取了一些额外的步骤来尝试清理坐标):

NaN

重新投影数据:

df = pd.read_csv('data.csv', usecols=['latitude', 'longitude'])
df.apply(lambda x: pd.to_numeric(x,errors='coerced')).dropna()
df = df.loc[(df['latitude'] > - 90) & (df['latitude'] < 90) & (df['longitude'] > -180) & (df['longitude'] < 180)]

重新投影x_range和y_range。这是至关重要的,因为这些值设置了# WGS 84 inProj = Proj(init='epsg:4326') # WGS84 Pseudo Web Mercator, projection for most WMS services outProj = Proj(init='epsg:3857') df['xWeb'],df['yWeb'] = transform(inProj,outProj,df['longitude'].values,df['latitude'].values) 映射的范围-这些值的坐标需要与投影匹配。为了确保您具有正确的坐标,建议您使用http://bboxfinder.com创建一个边界框AOI,并获取正确的最小/最大和最小/最大坐标(确保bokeh)。使用此方法,只需复制“框”旁边的coodinates-它们按照EPSG:3857 - WGS 84/Pseudo-Mercator is selectedminxminymaxx的顺序排列,然后应重新排列为{ {1}},maxyminxmaxxminy)(maxy):

x_range = (minx,maxx)