2017-09-25 6 views
0

最初に、英国ポストコードエリアのインタラクティブマップを作成しました。ここで、個々のエリアはその値(たとえば、ポストコードエリア内の人口)に基づいて表されます。bokeh - データシェイダーを使用してシェイプファイルマップをプロットする

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座標、値(すなわち母集団)の4つの列のデータフレームです。

上記のコードは、Webブラウザにインタラクティブマップを作成しますが、インタラクティブ性が非常に滑らかではないことに気付きました。地図を拡大または移動すると、ゆっくりとレンダリングされます。データフレームのサイズは1106行しかないので、なぜそれが遅いのかはかなり混乱しています。

私はdatashader(https://datashader.readthedocs.io/en/latest/)に遭遇しましたが、サンプルスクリプトはかなり複雑で、ほとんどがJupyterノートブックのholoviewパッケージですが、bokehを使用してダッシュボードを作成したいと考えています。

上記のbokehスクリプトにdatashaderを組み込むことについて助言してくれる人はいませんか? bokehのパッチ関数を使用するのではなく、シェイプマップを作成するためにdatashader内で別の関数が必要ですか?

どのような提案も高く評価されます。

+1

データフレームのサイズが私には問題ないようです。どのようにしてパッチを作成しましたか?シェイプファイルやジオジソンを使用していますか?非常に複雑なポリゴンをプロットすると速度が低下する可能性があると私は考えています。あなたはあなたのポリゴンを単純化することができます。 – mc51

+0

http://www.opendoorlogistics.com/downloads/のシェイプファイル形式で英国のポストコード境界ポリゴンを使用しました。英国のポストコードエリアポリゴンは複雑すぎますか?私は視覚化の目的のために領域を使用する必要がありますし、おそらく低解像度英国の郵便番号形状ファイルがありますか? – user4279562

答えて

4

関連するデータファイルがなければ、私は直接あなたの質問に答えることはできませんが、いくつかの観測を提供することができますが:

  1. datashaderは現在、任意のサポートを持っていないためDatashaderは、この目的のために価値があることはほとんどありませんポリゴンをレンダリングする。大まかに言えば、Datashaderはデータを集約するように設計されており、すでに集計されている場合、Datashaderは通常役に立ちません。ここでデータは郵便番号で集計されますが、データシートは処理できませんが、元のデータが1人であればレンダリングするのが喜ばしいでしょう。
  2. より高度なHoloViews/GeoViewsインターフェイスではなく、Bokehを直接使用することをお望みなら、Matt Rocklinの作業をaccelerating geopandasにフォローすることをお勧めします。彼のアプローチはあなたの目的のために非常に速くなければなりません。
  3. HoloViewsGeoViewsは、ダッシュボードを作成するかどうかにかかわらず、一般的なBokehを操作するのに便利な方法です。例えば。 2017 JupyterCon tutorialは、両方のライブラリを使用して簡単なBokehダッシュボードを作成する方法を示しています。形状ファイルはカバーされていませんが、other GeoViews examplesに記載されています。
+0

上記のスクリプトを編集して、シェイプファイルをどのようにしてbokehのパッチ関数にしたのかを説明しました。なぜこのアプリケーションでBokehだけでなくHoloViews/GeoViewsを使用する必要があるのか​​説明できますか?ありがとうございました。 – user4279562

+0

GeoViewをここで使用する必要はありません。それだけで便利です。例えば。シェイプファイルを与えられたシェイプベースのchoroplethをプロットすると、 '' gv.Shape.from_records(shapes.records()、data、on = 'code'、value = 'column'、index = 'name'、crs = crs)のようになります。 PlateCarree()) ''、対応するBokehコードはもっと長く複雑です。しかし結果はどちらの場合も同じBokehプロットですので、好きなAPIを使用してください! –

0

私のコメントで述べたように、ポリゴンの複雑さによって問題が生じる可能性があります。リンク先のファイルには、さまざまなサイズと複雑さのシェイプファイルがいくつか含まれています。それらを単純化することができます。つまり、各ポリゴンのポイント数を減らすことができます。これは彼らの見た目を変えることができます。それは、もう少し「ぎこちなさ」よりもほとんど違いがなく、角度のある外観に及ぶことがあります。これは、選択した簡略化のレベルによって異なります。ニーズに応じて、さまざまなレベルのシンプルさを選択できます。

私はこれを成し遂げるために3つの簡単なオプションを知っている:

  1. GUI:QGisを試してみてください。地理空間データ処理のための素晴らしいオープンソースツールです。シェイプファイルを新しいレイヤーとしてロードします。次に、[ベクター]メニューの[形状を簡略化]ツールを使用します。
  2. コマンドライン:GDALはオープ​​ンソースライブラリです。便利なコマンドラインツールが付属しています。このように使用することができます:ogr2ogr outfile.shp infile.shp -simplify 0.000001
  3. オンライン:mapshaderにアクセスしてください。ファイルをインポートします。簡略化を選択し、レベルを選択してください。次に、結果をエクスポートします。私が本当に好きなのは、ファイルが即座にレンダリングされるということです。したがって、あなたは簡単化の結果をすぐに見ることができます。

ボケ以外のバージョンも更新する必要があります。それは定期的に更新され、その後いくつかのパフォーマンスが改善されています。

HoloViewsまたはGeoViewsを使用しても、パフォーマンスに悪影響はありません。したがって、それはあなたの問題に関連していません。私は@James A. Bednarがちょうどそこにいくつかのサイドアドバイスを与えていたと思います。

0

私はスライダーを動かすと、英国の地図のインタラクティブな視覚化をスピードアップする方法を見つけました。

ボケのパッチ機能を使用する代わりに、スライダの最初の値が異なる2Dイメージを作成し、2Dイメージを使用してマップを更新しました。

イメージは配列形式であるため、スライダの値を変更しながらイメージを更新する方がはるかに高速です。この方法の1つの欠点は、もはや英国の地図上でホバー機能を使用できなくなることです。

私は配列にポリゴン情報を変換するには、以下のURLを参照:https://gist.github.com/brendancol/db030013e981c46acb2886060dde607e#file-rasterio_datashader_polygons-py-L35

関連する問題