2017-09-25 79 views
0

最初,我創建了一個英國郵政編碼區域的交互式地圖,其中個別區域是基於其值(例如該郵政編碼區域中的人口)表示的顏色,如下所示。散景 - 使用數據查詢器繪製shapefile地圖

from bokeh.plotting import figure 
from bokeh.palettes import Viridis256 as palette 
from bokeh.models import LinearColorMapper 
from bokeh.models import ColumnDataSource 
import geopandas as gpd 

shp = 'file_path_to_the_downloaded_shapefile' 
#read shape file into dataframe using geopandas 
df = gpd.read_file(shp) 

def expandMultiPolygons(row, geometry): 
    if row[geometry].type = 'MultiPolygon': 
     row[geometry] = [p for p in row[geometry]] 
    return row 
#Some rows were in MultiPolygons instead of Polygons. 
#Expand MultiPolygons to multi rows of Polygons 
df = df.apply(expandMultiPolygons, geometry='geometry', axis=1) 
df = df.set_index('Area')['geometry'].apply(pd.Series).stack().reset_index() 

#Visualize the polygons. To visualize different colors for different post areas, I added another column called 'value' which has some random integer value. 

p = figure() 
color_mapper = LinearColorMapper(palette=palette) 
source = ColumnDataSource(df) 
p.patches('x', 'y', source=source,\ 
      fill_color={'field': 'value', 'transform': color_mapper},\ 
      fill_alpha=1.0, line_color="black", line_width=0.05) 

其中df是四列的數據框:郵政編碼區域,x座標,y座標,值(即總體)。

上面的代碼在網頁瀏覽器上創建了一個很好的交互式地圖,但我注意到交互速度並不是很平滑。如果我放大或移動地圖,它會呈現緩慢。數據幀的大小隻有1106行,所以我很困惑它爲什麼這麼慢。

作爲可能的解決方案之一,我遇到了datashader(https://datashader.readthedocs.io/en/latest/),但我發現這個示例腳本非常複雜,其中大部分都是在Jupyter筆記本上使用holoview包,但我想使用散景創建儀表板。

有沒有人建議我將datashader合併到上面的散景腳本中?在數據採集器中是否需要使用不同的功能來創建形狀映射,而不是使用散景的補丁功能?

任何建議將不勝感激!

+1

數據幀的大小似乎不成問題給我。你是如何創建你的補丁?你使用shapefile還是geojson?我認爲繪製非常複雜的多邊形可能會降低速度。你可以嘗試簡化你的多邊形。 – mc51

+0

我從http://www.opendoorlogistics.com/downloads/以shapefile格式使用英國郵政編碼邊界多邊形。英國郵政編碼區域多邊形是否太複雜?我需要使用區域進行可視化目的,也許還有低分辨率英國郵政編碼形狀文件呢? – user4279562

回答

4

沒有涉及到的數據文件,我不能直接回答你的問題,但可以提供一些意見:

  1. Datashader是不太可能的值用於此目的,因爲datashader目前還沒有任何支持用於渲染多邊形。作爲一個經驗法則,Datashader旨在彙總您的數據,如果它已經彙總,Datashader通常不會提供幫助。在這裏,您的數據通過郵政編碼彙總,哪個數據處理器無法處理,但是如果您有每個人的原始數據,它將很樂意呈現它。
  2. 如果您喜歡直接使用Bokeh而不是通過更高級別的HoloViews/GeoViews界面,我建議您參考Matt Rocklin的作品accelerating geopandas;他的方法應該是非常快速的爲您的目的。
  3. 所有這一切,HoloViewsGeoViews應該是一個方便的方式與Bokeh一起工作,無論您是否想要創建儀表板。例如。 2017 JupyterCon tutorial展示瞭如何使用這兩個庫來製作簡單的Bokeh儀表板。它不包含形狀文件,但這些文件在other GeoViews examples中有描述。
+0

我編輯了上面的腳本,解釋瞭如何將形狀文件轉換爲散景的修補功能。你能解釋爲什麼在這個應用程序中需要使用HoloViews/GeoViews而不是Bokeh?謝謝。 – user4279562

+0

這裏不需要使用GeoViews;這只是方便。例如。繪製shapefile的shape-based choropleth就像''gv.Shape.from_records(shapes.records(),data,on ='code',value ='column',index ='name',crs = crs。 PlateCarree()),而相應的Bokeh代碼更長更復雜。但結果是任何方式都是相同的散景圖,所以請使用您喜歡的任何API! –

0

正如在我的評論中提到的,我相信你的多邊形的複雜性可能會導致你的問題。鏈接到的文件包含多個不同大小和複雜度的shapefile。您可以簡化這些操作,即減少每個多邊形的點數。這可以改變他們的外觀。它的範圍從幾乎沒有區別的多一點「邊緣」到有角的外觀。這取決於您選擇的簡化級別。根據您的需求,您可以選擇不同級別的簡單性。

我知道的三個簡單的選項來完成這件事:

  1. GUI:嘗試QGis。這是一個很好的地理空間數據處理開源工具。加載你的Shapefile作爲一個新層。然後使用矢量菜單下的「簡化幾何圖形」工具。
  2. 命令行:GDAL是一個開源庫。它帶有一個有用的命令行工具。你可以這樣使用它:ogr2ogr outfile.shp infile.shp -simplify 0.000001
  3. 在線:訪問mapshader。導入您的文件。選擇簡化並選擇你的關卡。然後,導出結果。我真的很喜歡這裏是你的文件立即呈現。因此,您可以立即看到您的簡化結果。

除此之外,你還應該更新你的散景版本。它會定期更新,並且自那以後出現了一些性能提升。

使用HoloView或GeoViews不會對您的性能產​​生積極影響。因此,這與您的問題無關。我想@James A. Bednar只是在那裏提供一些建議。

0

當我移動滑塊時,我發現了一種加速英國地圖的交互式可視化的方法。

我首先爲不同的滑塊值創建了單獨的圖像(2D),並使用2D圖像更新了地圖,而不是使用散景的補丁功能。

由於圖像是數組格式,在更改滑塊中的值時更新圖像要快得多。這種方法的一個缺點是我不能再在英國地圖上使用懸停功能。

我提及到以下網址多邊形信息轉換成數組:https://gist.github.com/brendancol/db030013e981c46acb2886060dde607e#file-rasterio_datashader_polygons-py-L35