シェイプ長さ属性の単位とは何ですか?


11

私は形を使ってポリラインの長さの非常に簡単な計算をしています:

from shapely.geometry import LineString
... 
xy_list = [map(float,e) for e in xy_intm]
line = LineString(xy_list)
s = '%s,%s,%s' % (fr,to,line.length)

私の座標はWGS84です。shapelyの長さ属性に関する情報が見つからないようです。長さ属性の単位は何ですか?kmまたはメートルに変換する簡単な方法はありますか?


2つのサンプル形状の座標と長さを提供できますか?
Vince

回答:


13

以下のようalfacianoがスッキリで言う、距離はユークリッド距離や線形平面上の2点間の距離とではありません大圏距離球面上の2点間で。

from shapely.geometry import Point
import math


point1 = Point(50.67,4.62)
point2 = Point(51.67, 4.64)

# Euclidean Distance
def Euclidean_distance(point1,point2):
     return math.sqrt((point2.x()-point1.x())**2 + (point2.y()-point1.y())**2)

print Euclidean_distance(point1,point2)
1.00019998 # distance in degrees (coordinates of the points in degrees)

# with Shapely
print point1.distance(point2)
1.0001999800039989 #distance in degrees (coordinates of the points in degrees)

大圏距離の場合、コサインの法則またはハバーシンの式としてアルゴリズムを使用する2つの緯度経度の点の間の距離を計算するときに、コサインの法則がハバーシンよりも望ましいのはなぜですか?)、またはモジュールpyprojを使用する必要があります測地計算を実行します。

# law of cosines
distance = math.acos(math.sin(math.radians(point1.y))*math.sin(math.radians(point2.y))+math.cos(math.radians(point1.y))*math.cos(math.radians(point2.y))*math.cos(math.radians(point2.x)-math.radians(point1.x)))*6371
print "{0:8.4f}".format(distance)
110.8544 # in km
# Haversine formula
dLat = math.radians(point2.y) - math.radians(point1.y)
dLon = math.radians(point2.x) - math.radians(point1.x)
a = math.sin(dLat/2) * math.sin(dLat/2) + math.cos(math.radians(point1.y)) * math.cos(math.radians(point2.y)) * math.sin(dLon/2) * math.sin(dLon/2)
distance = 6371 * 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
print "{0:8.4f}".format(distance)distance
110.8544 #in km

# with pyproj
import pyproj
geod = pyproj.Geod(ellps='WGS84')
angle1,angle2,distance = geod.inv(point1.x, point1.y, point2.x, point2.y)
print "{0:8.4f}".format(distance/1000)
110.9807 #in km

経度緯度距離計算機で結果をテストできます

ここに画像の説明を入力してください


すばらしい答え、ジーン!あなたの非常に詳細な説明に感謝します。
アントニオ・ファルチャーノ

1
確かに、素晴らしい答えです。私が間違っていない場合はgeopy、大圏距離とVincenty距離の計算を実装したと呼ばれる別のpythonパッケージがあります。
LarsVegas 2013

を使用した測地線距離計算の詳細を次に示しgeopyます。
アントニオ・ファルチャーノ

13

座標系

[...] Shapelyは座標系変換をサポートしていません。2つ以上のフィーチャに対するすべての操作は、フィーチャが同じデカルト平面に存在することを前提としています。

出典:http : //toblerity.org/shapely/manual.html#coordinate-systems

ビーイングshapelySRSを参考に完全に依存しない、それは長さ属性は、あなたのラインストリングの座標、すなわち度の同じ単位で表現されていることは明白です。実際には:

>>> from shapely.geometry import LineString
>>> line = LineString([(0, 0), (1, 1)])
>>> line.length
1.4142135623730951

代わりに、長さをメートルで表現したい場合は、pyprojを使用して、ジオメトリをWGS84から投影されたSRSに変換する必要があります(または、測地線距離の計算を実行します。Geneの回答を参照してください)。詳細には、バージョン1.2.18shapely.__version__)以降、と組み合わせて使用​​できるジオメトリ変換関数http://toblerity.org/shapely/shapely.html#module-shapely.ops)をshapelyサポートしています。ここに簡単な例があります:pyproj

from shapely.geometry import LineString
from shapely.ops import transform
from functools import partial
import pyproj

line1 = LineString([(15.799406, 40.636069), (15.810173,40.640246)])
print str(line1.length) + " degrees"
# 0.0115488362184 degrees

# Geometry transform function based on pyproj.transform
project = partial(
    pyproj.transform,
    pyproj.Proj(init='EPSG:4326'),
    pyproj.Proj(init='EPSG:32633'))

line2 = transform(project, line1)
print str(line2.length) + " meters"
# 1021.77585965 meters
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.