आकार की लंबाई विशेषता की इकाई क्या है?


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

जैसा कि अल्फासियानो आकार में कहता है, दूरी एक विमान पर दो बिंदुओं के बीच यूक्लिडियन दूरी या रेखा की दूरी है और एक गोले पर दो बिंदुओं के बीच महान-वृत्त दूरी नहीं है ।

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

आप परिणाम देशांतर अक्षांश कैलकुलेटर पर परीक्षण कर सकते हैं

यहां छवि विवरण दर्ज करें


शानदार जवाब, जीन! आपके बहुत विस्तृत विवरण के लिए बहुत धन्यवाद।
एंटोनियो फाल्कियानो

1
वाकई, शानदार जवाब। अगर मैं गलत नहीं हूँ तो एक और अजगर पैकेज कहा जाता geopyहै जिसने एक महान-सर्कल दूरी और विन्सेंटी दूरी की गणना को लागू किया है।
लार्सविगास

यहाँ के साथ जियोडेसिक दूरी की गणना के बारे में कुछ विवरण हैं geopy
एंटोनियो फाल्कियानो

13

सिस्टम संयोजित करें

[...] संक्षेप में समन्वय प्रणाली परिवर्तनों का समर्थन नहीं करता है। दो या दो से अधिक विशेषताओं के सभी ऑपरेशन यह मानते हैं कि विशेषताएँ एक ही कार्टेशियन विमान में मौजूद हैं।

स्रोत: http://toblerity.org/shapely/manual.html#coordinate-systems

shapelyएसआरएस के संदर्भ में पूरी तरह से अज्ञेयवादी होने के नाते , यह काफी स्पष्ट है कि लंबाई विशेषता आपके लिनस्ट्रिंग, यानी डिग्री के निर्देशांक की एक ही इकाई में व्यक्त की गई है। असल में:

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

इसके बजाय, यदि आप मीटर में लंबाई व्यक्त करना चाहते हैं, तो आपको अपने Geometries को WGS84 से एक अनुमानित SRS में pyproj (या, बेहतर, जियोडेसिक दूरी की गणना को निष्पादित करने, जीन का जवाब देखें) का उपयोग करके बदलना होगा । विस्तार से, संस्करण 1.2.18 ( shapely.__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('EPSG:4326'),
    pyproj.Proj('EPSG:32633'))

line2 = transform(project, line1)
print(str(line2.length) + " meters")
# 1021.77585965 meters
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.