ডাব্লুকেটি লিনিস্ট্রিংয়ের দৈর্ঘ্য গণনা করার জন্য পাইথোনিক উপায় খুঁজছেন


13

মাইলসের ডাব্লু জিএস 84-তে লেনস্ট্রিংয়ের দৈর্ঘ্য গণনা করে আমি যথেষ্ট অসন্তুষ্ট ছিলাম । প্রদত্ত এসআরআইডি অনুসারে ডাব্লুকেটি লাইনস্ট্রিংয়ের দৈর্ঘ্য গণনা করার জন্য আরও সুবিধাজনক, পাইথোনিক উপায় আছে কিনা তা আমাকে ভাবছিল।

আমার মনে কিছু আছে:

srid="WGS84"
line="LINESTRING(3.0 4.0, 3.1 4.1)"
print length(line, srid)

আমি একটি সঠিক উত্তর খুঁজছি, sin\cosআনুমানিক নয় ।

কোন ধারনা?


তবে, এটি একটি জিআইএস ওয়েবসাইট। আপনার উত্তর উপেক্ষা করে যে এটি জিওপ্যাটিয়াল স্থানাঙ্কের মধ্যে একটি দূরত্ব (এসআরআইডি দেখুন)। আকস্মিকভাবে নিজের মধ্যে ভূ-স্থানিক দূরত্বগুলি গণনা করতে পারে না কারণ এটিতে মানচিত্রের অভিক্ষেপের কোনও জ্ঞান নেই।

উত্তর:


18

Geopy মডিউল প্রদান করে Vincenty সূত্র , যা সঠিক উপবৃত্ত দূরত্বের প্রদান করে। wktআকারে লোডিংয়ের সাথে এটি দ্বিগুণ করুন এবং আপনার যুক্তিসঙ্গত সহজ কোড রয়েছে:

from geopy import distance
from shapely.wkt import loads

line_wkt="LINESTRING(3.0 4.0, 3.1 4.1)"

# a number of other elipsoids are supported
distance.VincentyDistance.ELLIPSOID = 'WGS-84'
d = distance.distance

line = loads(line_wkt)

# convert the coordinates to xy array elements, compute the distance
dist = d(line.xy[0], line.xy[1])

print dist.meters

1
+1 করতে পারলে +10 থাকত। আমার দলের ঘন্টা প্রোগ্রামিং সংরক্ষণ করা হয়েছে।
আদম মতান

যদি ইনপুট স্থানাঙ্কগুলি ইতিমধ্যে WGS-84 এ থাকে তবে এই দৃষ্টিভঙ্গিটি @ টমক্রালিডিস জবাব থেকে আলাদা কি?
লার্সভেগাস

1
@ লার্সভেগাস হ্যাঁ, কেবল পরিকল্পনাকারী স্থানাঙ্কগুলি সুদৃশ্যভাবে পরিচালনা করে - সুতরাং এটি অনুমিত স্থানটিতে দূরত্বগুলি সঠিকভাবে পরিমাপ করবে, তবে ভৌগলিক নয় (যেমন ডাব্লুজিএস -৮৮))।
স্ক্রু

4

আপনি শাপলির দৈর্ঘ্যের সম্পত্তিও ব্যবহার করতে পারেন , যেমন:

from shapely.wkt import loads

l=loads('LINESTRING(3.0 4.0, 3.1 4.1)')
print l.length

মনে রাখবেন যে এই নির্দিষ্ট উদাহরণের দৈর্ঘ্য অর্থহীন হবে, কারণ এটি একটি ভৌগলিক সমন্বয় ব্যবস্থা (WGS84) S
মাইক টি

2

আমি এটি সরাসরি করতে ogr2ogr ( http://www.gdal.org/ogr/index.html ) ব্যবহার করতাম তবে যদি আপনাকে সত্যই পাইথন ব্যবহার করতে হয় তবে পাইথন বাইন্ডিংগুলি রয়েছে ( http://pypi.python.org/pypi / জিডিএল / ) আপনাকে এটি করতে দেয়।


2

পার্টিতে লেট, তবে আশাবাদী কার্যকর অবদানের সাথে। ভূ-কৌশল ব্যবহার করে স্ক্রু-এর উত্তরের উপর ভিত্তি করে, আমি একটি ছোট ফাংশন লিখেছিলাম যা নির্বিচারে অনেকগুলি স্থানাঙ্ক সহ একটি সুদৃ .় লাইনস্ট্রিং অবজেক্টের জন্য গণনা করে। এটি pairsস্ট্যাকওভারফ্লো থেকে একটি পুনরুক্তি ব্যবহার করে ।

প্রধান বৈশিষ্ট্য: স্নিপেটগুলির চেয়ে ডকাস্ট্রিংগুলি দীর্ঘ।

def line_length(line):
    """Calculate length of a line in meters, given in geographic coordinates.
    Args:
        line: a shapely LineString object with WGS 84 coordinates
    Returns:
        Length of line in meters
    """
    # Swap shapely (lonlat) to geopy (latlon) points
    latlon = lambda lonlat: (lonlat[1], lonlat[0])
    total_length = sum(distance(latlon(a), latlon(b)).meters
                       for (a, b) in pairs(line.coords))
    return round(total_length, 0)


def pairs(lst):
    """Iterate over a list in overlapping pairs without wrap-around.

    Args:
        lst: an iterable/list

    Returns:
        Yields a pair of consecutive elements (lst[k], lst[k+1]) of lst. Last 
        call yields the last two elements.

    Example:
        lst = [4, 7, 11, 2]
        pairs(lst) yields (4, 7), (7, 11), (11, 2)

    Source:
        /programming/1257413/1257446#1257446
    """
    i = iter(lst)
    prev = i.next()
    for item in i:
        yield prev, item
        prev = item

1
এটি ভুল: geopy.distance.distance (y, x) এ স্থানাঙ্কগুলি গ্রহণ করে তবে একটি সুদৃ lin় লাইনস্ট্রিং "2 বা ততোধিক ক্রমের (ক্রম, y [, জেড]) ক্রমযুক্ত হয়" তাই ভূ-র সাহায্যকারী ফাংশন লোনল্ট () অবশ্যই ব্যবহার করা উচিত ।
মার্টিন বুর্চ

@ মার্টিনবার্চ: ওওচ, আপনি ঠিক বলেছেন। বাজে জিনিসটি এমনকি নয় [, z], তবে এটির (y, x)পক্ষে যুক্তিটিও অদলবদল করা (x, y)আবশ্যক। এটি সন্ধানের জন্য ধন্যবাদ। এই সম্পাদনাটি কম বাগ-চালিত দেখাচ্ছে কি না আপনি চোখের জল ফেলতে পারেন?
ojdo
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.