หน่วยของคุณลักษณะความยาวหุ่นดีคืออะไร


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 ฉันไม่สามารถหาข้อมูลเกี่ยวกับคุณลักษณะความยาวของหุ่นดีได้ หน่วยของคุณสมบัติความยาวคืออะไร? มีวิธีง่าย ๆ ในการแปลงเป็นกม. หรือเมตรหรือไม่?


คุณสามารถระบุพิกัดและความยาวสำหรับรูปร่างตัวอย่างสองรูปแบบได้หรือไม่?
วินซ์

คำตอบ:


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 ที่ (ดูที่เหตุใดจึงเป็นกฎหมายของความผาสุกที่นิยมมากขึ้นกว่า 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

คุณสามารถทดสอบผลลัพธ์ได้ที่Longitude Latitude Distance Calculator

ป้อนคำอธิบายรูปภาพที่นี่


คำตอบที่ดีเยี่ยมยีน! ขอบคุณมากสำหรับคำอธิบายโดยละเอียดของคุณ
Antonio Falciano เมื่อ

1
แน่นอนคำตอบที่ดี ถ้าฉันไม่เข้าใจผิดมีแพ็คเกจไพ ธ อนอื่นที่เรียกgeopyว่าใช้ระยะทางเป็นวงกลมที่ยอดเยี่ยมและการคำนวณระยะทาง Vincenty
LarsVegas

นี่geopyเป็นรายละเอียดเกี่ยวกับการคำนวณระยะทางเนื้อที่ด้วย
Antonio Falciano

13

ระบบพิกัด

[... ] หุ่นดีไม่รองรับการแปลงระบบพิกัด การดำเนินการทั้งหมดในฟีเจอร์สองอย่างขึ้นไปสันนิษฐานว่าฟีเจอร์นั้นมีอยู่ในระนาบคาร์ทีเซียนเดียวกัน

ที่มา: http://toblerity.org/shapely/manual.html#coordinate-systems

เป็นshapelyผู้ไม่เชื่อเรื่องพระเจ้าอย่างสมบูรณ์ในการอ้างอิงถึง SRS มันค่อนข้างชัดเจนว่าแอตทริบิวต์ความยาวจะแสดงในหน่วยเดียวกันของพิกัดของคุณเช่นองศา ในความเป็นจริง:

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

หากคุณต้องการแสดงความยาวเป็นเมตรคุณจะต้องแปลงรูปทรงเรขาคณิตของคุณจาก WGS84 เป็น SRS ที่ฉายโดยใช้pyproj (หรือดีกว่ารันการคำนวณระยะทางทางธรณีวิทยาดูที่คำตอบของยีน) รายละเอียดตั้งแต่รุ่น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.