最近、ogr / gdalに付属するOGRプロジェクションクラスを使用していますが、pyprojが推奨されたので、試してみようと思いました。切り替えるかどうかを判断するために、速度テストを行いました。以下は、2つをテストするために思いついた小さな(ほとんど)再現可能な例です。このテストが完全に公正であるかどうかはわかりませんので、コメントや推奨事項を歓迎します!
最初にインポートして、平等なプレイフィールドから始めることを確認します。
from pandas import Series # This is what our geometries are stored in
from shapely import wkb
import functools
from shapely.geometry import shape
from osgeo import ogr
# The following two imports are the important ones
from pyproj import Proj, transform
from osgeo.osr import SpatialReference, CoordinateTransformation
私はパンダの「シリーズ」に形の良い形状を保存しているので、関数はで動作する必要がありSeries.apply()
ます。ここでは、2つの関数(1つは 'ogr.osr'を使用し、もう1つは 'pyproj'を使用)を定義して、への呼び出し内で座標変換を実行しますSeries.apply()
。
def transform_osr(geoms, origin, target):
target_crs = SpatialReference()
target_crs.ImportFromEPSG(origin)
origin_crs = SpatialReference()
origin_crs.ImportFromEPSG(origin)
transformer = CoordinateTransformation(origin_crs, target_crs)
def trans(geom):
g = ogr.CreateGeometryFromWkb(geom.wkb)
if g.Transform(transformer):
raise Exception("Ahhhh!")
g = wkb.loads(g.ExportToWkb())
return g
return geoms.apply(trans)
def transform_pyproj(geoms, origin, target):
target = Proj(init="epsg:%s" % target)
origin = Proj(init="epsg:%s" % origin)
transformer = functools.partial(transform, origin, target)
def trans(geom):
interface = geom.__geo_interface__
geom_type = interface['type']
coords = interface['coordinates']
result = apply_to_coord_pairs(transformer, coords)
return shape({'coordinates':result, 'type':geom_type})
def apply_to_coord_pairs(fun, geom):
return [not all([hasattr(y, "__iter__") for y in x]) and \
fun(*x) or apply_to_coord_pairs(fun, x) for x in geom]
return geoms.apply(trans)
これらの各関数は、起点と終点の座標参照系の入力としてEPSGコードを受け取ります。どちらのライブラリも、投影情報を定義する別の方法を提供しますが、EPSGコードは今のところコードをかなり単純なものにしています。
%timeit
ipythonでmagic関数を使用した結果は次のとおりです。
In [1]: %timeit transform_pyproj(l, 29903, 4326)
1 loops, best of 3: 641 ms per loop
In [2]: %timeit transform_osr(l, 29903, 4326)
10 loops, best of 3: 27.4 ms per loop
明らかに「ogr.osr」バージョンの方が高速ですが、それは公平な比較ですか?「pyproj」バージョンは個々のポイントで実行され、ほとんどがPythonで実行されますが、「ogr.osr」バージョンはOGRジオメトリオブジェクトを直接操作します。これらを比較するより良い方法はありますか?
projected_coords = numpy.vstack(pyproj.transform(origin, target, *numpy.array(geom).T)).T