最終的に、matplotlib ライブラリの Basemap ツールキットを使用して作成しました。それがどのように機能するかを説明します。おそらく、これはいつか誰かに役立つでしょう。
1. システムに matplotlib ライブラリをダウンロードしてインストールします。
http://matplotlib.org/downloads.html
Windows バイナリについては、次のページを使用することをお勧めします:
http://www.lfd.uci.edu/~gohlke/pythonlibs/#matplotlib
次のヒントに注意してください。
numpy、dateutil、pytz、pyparsing、six、およびオプションで pillow、pycairo、tornado、wxpython、pyside、pyqt、ghostscript、miktex、ffmpeg、mencoder、avconv、または imagemagick が必要です。
したがって、システムにまだインストールされていない場合は、matplotlib が適切に機能するように、numpy、dateutil、pytz、pyparsing、および six をダウンロードしてインストールする必要があります (Windows ユーザーの場合: Linux ユーザーの場合は、これらすべてがページにあります)。 、pythonパッケージマネージャー「pip」がうまくいくはずです)。
2. matplotlib の「basemap」ツールキットをダウンロードしてインストールします。http://matplotlib.org/basemap/users/installing.htmlから、
または Windows バイナリの場合はこちらから:
http://www.lfd.uci.edu/~gohlke/pythonlibs/#basemap
3. Python コードでプロジェクションを実行します。
#Import necessary libraries
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np
#Coordinates that are to be transformed
long = -112.367
lat = 41.013
#Create a basemap for your projection. Which one you use is up to you.
#Some examples can be found at http://matplotlib.org/basemap/users/mapsetup.html
m = Basemap(projection='sinu',lon_0=0,resolution='c')
#Project the coordinates:
projected_coordinates = m(long,lat)
出力:
投影座標 (10587117.191355567、14567974.064658936)
そのような単純な。ここで、投影された座標を使用して shapely でポリゴンを構築し、その後 shapely の面積法で面積を計算すると、(使用した投影法に従って) 平方メートル単位で面積が得られます。平方キロメートルを求めるには、10^6 で割ります。
編集:単一の座標のみを変換するのではなく、ポリゴンのようなジオメトリ オブジェクト全体を変換するのに苦労しました。これは、多くのコードを書くことを意味しました
- 多角形の外輪の座標を取得する
- ポリゴンに穴があるかどうかを判断し、ある場合は各穴を個別に処理します
- 外輪と任意の穴の座標の各ペアを変換します
- 全体を元に戻し、投影された座標でポリゴン オブジェクトを作成します
- それはポリゴン専用です...マルチポリゴンとジオメトリコレクションのために、これにさらにループを追加します
それから、物事をより簡単にする形の良いドキュメントのこの部分に出くわしました:
http://toblerity.org/shapely/manual.html#shapely.ops.transform
たとえば、上記のように投影マップが設定されている場合:
m = Basemap(width=1,height=1, resolution='l',projection='laea',lat_ts=50,lat_0=50,lon_0=-107.)
次に、次の方法でこの射影を使用して、形の整ったジオメトリ オブジェクトを変換できます。
from shapely.ops import transform
projected_geometry = transform(m,geometry_object)