缩放时如何调整像素/像素的大小

问题描述 投票:0回答:1

我目前正在尝试通过数据着色器和bokeh将数据集(柏林公共交通站点)投影到地图上。在一定程度上它运行良好,但仍然存在三个问题:

  1. 放大数据时,像素仍然很大,并且没有重新排列-怎么做?
  2. 如何使投影数据半透明,仍然可以看到下面的地图?
  3. bokeh工具栏的“保存”功能消失了,因为地图瓦片已合并。如何找回它?

感谢您的输入!

编写的(远非完美)代码:

import numpy as np
import pandas as pd
import geopandas as gp
import datashader as ds
import datashader.transfer_functions as tf
from datashader.utils import export_image
from datashader.utils import lnglat_to_meters as webm
from datashader.colors import Hot
import dask.dataframe as dd
import multiprocessing as mp
from functools import partial
from IPython.core.display import HTML, display
import matplotlib.pyplot as plt
import holoviews as hv
from holoviews.operation.datashader import datashade, dynspread
hv.extension("bokeh", "matplotlib")
from bokeh.io import output_file, output_notebook, show
from bokeh.plotting import figure, show
from holoviews import dim, opts
import geoviews as gv
from colorcet import palette, fire

#get official data of bus/subway stops in Berlin
# -> https://www.vbb.de/media/download/2035
#read data
df = pd.read_csv('UMBW.CSV', engine= 'python', sep=';', usecols=['Y-Koordinate', 'X-Koordinate'])

##some formatting
##replace comma by point
df = df.apply(lambda x: x.str.replace(',','.'))
#delete rows witn NaN -> pandas.DataFrame.dropna
df = df.dropna()
#entries were objects - need to convert to floats
df['X-Koordinate']=pd.to_numeric(df['X-Koordinate'])
df['Y-Koordinate']=pd.to_numeric(df['Y-Koordinate'])

# Project longitude and latitude onto web mercator plane.
df.loc[:, 'easting'], df.loc[:, 'northing'] = webm(df['X-Koordinate'],df['Y-Koordinate'])

# Getting range/box of latitude and longitude for plotting later.
# drop the points lying on the border
y_range_min = df['Y-Koordinate'].quantile(0.01)
y_range_max = df['Y-Koordinate'].quantile(0.99)
x_range_min = df['X-Koordinate'].quantile(0.01)
x_range_max = df['X-Koordinate'].quantile(0.99)

#cornerspots for canvas
sw = webm(x_range_min,y_range_min)#southwest
ne = webm(x_range_max,y_range_max)#northeast
SF = zip(sw, ne)

dask_df = dd.from_pandas(df, npartitions=mp.cpu_count())
dask_df = dask_df.compute()

display(HTML("<style>.container { width:100% !important; }</style>"))

plot_width = int(3600)
plot_height = int(3600)
cvs = ds.Canvas(plot_width, plot_height, *SF)
agg = cvs.points(dask_df, 'easting', 'northing')

#dynamic map tiles -> https://wiki.openstreetmap.org/wiki/Tile_servers
#url="http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{Z}/{Y}/{X}.png"
url="https://a.tile.openstreetmap.org/{Z}/{X}/{Y}.png"
geomap = gv.WMTS(url)

#manipulate pixelsize for zoom
dynspread.max_px=1
dynspread.threshold=0.1

points = hv.Points(gv.Dataset(dask_df, kdims=['easting', 'northing']))
bvg_stops = dynspread(datashade(points, cmap=Hot).opts(height=640,width=640))
fig = geomap * bvg_stops
hv.save(fig, 'berlin.html', backend='bokeh')

初始散景图和放大版本(在科特布斯市附近)的示例输出。

Bokeh plot of the dataset (not zoomed)Bokeh plot of the dataset (zoomed)

python zoom bokeh holoviews datashader
1个回答
1
投票
  1. “当放大数据时,像素仍然很大并且没有重新排列-如何做到这一点?”

    Datashader是一个Python程序,当给定数据结构时,它会生成栅格化值的数组。在这里,它根据请求呈现数据,然后使用hv.save将其输出保存到HTML文件。一旦执行此操作,您将拥有一个永远不会更新的图形。您将放大HTML页面,从而导致浏览器的JavaScript代码从Python请求更新,但是Python没有运行,并且无法响应对更新图形的请求。如果要将可缩放的图像导出到HTML,则需要使用datashade(..., dynamic=False, height=4000, width=4000)之类的东西指定更高的初始分辨率(这会产生较大的文件大小,乍看起来可能并不好,但是会允许一定程度的缩放),或者以各种分辨率(由Datashader支持,但记录不充分)生成一整套数据切片,或者(为了获得全部功能)使用Bokeh服务器提供一个Python进程来伴随HTML / JavaScript代码。也就是说,要么先生成更多数据,要么预先生成所有数据组合,要么提供可以按需重新生成数据的服务器。如果没有这些方法中的一种,则不应期望除了初始渲染之外还有任何可用数据。

  2. 如何使投影数据半透明以仍然看到下面的地图?

    bvg_stops.opts(alpha=0.5)。您也可以考虑使用Panel.pyviz.org为地图和数据添加一些不透明度的小部件,以使您可以交互方式打开和关闭它们;有关示例,请参见examples.pyviz.org。

  3. 当合并图块时,散景工具栏的
  4. 散景工具栏的“保存”功能消失了。如何找回它?

    [不幸的是,这是由浏览器的安全模型引起的限制,不是Bokeh或此处的任何其他工具都可以覆盖的东西。地图图块来自单独的服务器,浏览器禁止导出此类“跨域”内容,以避免某些安全问题(Can't Save Bokeh Plot with Panel from PyViz Example)。

© www.soinside.com 2019 - 2024. All rights reserved.