매끈한 길이 단위 속성은 무엇입니까?


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입니다. 매끈한 길이 속성에 대한 정보를 찾지 못하는 것 같습니다. 길이 속성의 단위는 무엇입니까? km 또는 미터로 변환하는 쉬운 방법이 있습니까?


두 개의 샘플 모양에 대한 좌표와 길이를 제공 할 수 있습니까?
Vince

답변:


13

으로 alfaciano은 매끈한에서 말한다 거리가 유클리드 거리 또는 선형 평면의 두 점 사이의 거리가 아니라입니다 위대한 - 원 거리 구에 두 점 사이는.

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)

원이 큰 거리의 경우 알고리즘을 코사인 법칙 또는 Haversine 공식으로 사용하거나 ( 두 위도 경도 지점 사이의 거리를 계산할 때 코사인 법칙이 왜 소르 세인보다 선호 되는가? ) 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

경도 위도 거리 계산기 에서 결과를 테스트 할 수 있습니다

여기에 이미지 설명을 입력하십시오


좋은 대답, 유전자! 매우 자세한 설명에 감사드립니다.
Antonio Falciano

1
실제로 큰 대답입니다. 내가 실수하지 않으면 geopy큰 원거리와 Vincenty 거리 계산을 구현 한라는 파이썬 패키지 가 있습니다.
LarsVegas

측지 거리 계산에 대한 자세한 내용은 다음과 같습니다geopy .
Antonio Falciano

13

좌표계

[...] Shapely는 좌표계 변환을 지원하지 않습니다. 둘 이상의 피쳐에 대한 모든 작업은 피쳐가 동일한 데카르트 평면에 존재한다고 가정합니다.

출처 : 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로 변환해야합니다 (또는 측지 거리 계산을 수행하는 것이 좋습니다. 유전자의 답 참조). 구체적으로, 버전 1.2.18 ( shapely.__version__) 부터 와 함께 사용할 수 shapely있는 지오메트리 변환 함수 ( http://toblerity.org/shapely/shapely.html#module-shapely.ops )를 지원합니다 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('EPSG:4326'),
    pyproj.Proj('EPSG:32633'))

line2 = transform(project, line1)
print(str(line2.length) + " meters")
# 1021.77585965 meters
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.