簡體   English   中英

計算python中多邊形的長度

[英]Calculate the length of a polygon in python

我有一個 geopandas dataframe:

    lon           lat         geometry
0   31.269899   30.072927   POINT (30.07293 31.26990)
1   31.269413   30.073965   POINT (30.07397 31.26941)
2   31.268751   30.073629   POINT (30.07363 31.26875)
3   31.269287   30.073505   POINT (30.07351 31.26929)
4   31.269081   30.074694   POINT (30.07469 31.26908)

我從所有這些點中創建了一個多邊形,如下所示:

import geopandas as gpd
from shapely.geometry import Point, Polygon

gdf = gpd.GeoDataFrame(df,geometry = gpd.points_from_xy(df['lat'],df['lon']))
points = [x for x in gdf.geometry]
polygon = Polygon([[p.x, p.y] for p in points])
print(polygon)

output 是一個多邊形:

POLYGON ((30.072927474975586 31.269899368286133, 30.073965072631836 31.269412994384766, 30.07362937927246 31.26875114440918, 30.073505401611328 31.269287109375, 30.07469367980957 31.269081115722656, 30.073972702026367 31.269569396972656, 30.074140548706055 31.269651412963867, 30.07431983947754 31.26882553100586,...)

我怎樣才能得到以米為單位的長度? 例如,獲取 map 上第一個零售商和最后一個零售商之間的距離,以便它呈現一條可以測量的形狀。

我試過這段代碼:

polygon.length * 0.000621371

它給出了:5.04009394506436e-05

這是錯誤的。

伙計們,我在這里做錯了什么?

另一種方法是使用geopy和它的 function 稱為distance ,對您的代碼添加一些更改。 地理距離文檔

用法:

geopy.distance.distance([from.lon, from.lat], [to.lon, to.lat]).km

不確定是否有內置的 function 可以轉換為米,但是如果有千米,你自己應該很容易做到。

我怎樣才能得到以米為單位的長度?

坐標 (lat, lon) 之間的單位距離是千米,因此要以米為單位進行換算,只需乘以 1000:

>>> polygon.length * 1000
5.592554141703987  # meters

多邊形.length * 0.000621371

您想要以米還是英里為單位的距離?

我認為你沒有得到有效措施的問題是你正在處理一個shapely.Polygon object。事實上,因為這個(據我所知)沒有(CRS)的概念,你在計算其長度之前,首先需要將多邊形的每個點/xy 轉換為使用米(即EPSG 32636 )的投影系統。

為此,您可以使用pyproj.transformer.Transformer

from pyproj import Transformer #pip install pyproj
​
transformer = Transformer.from_crs("epsg:4326", "epsg:32636", always_xy=True)

x, y = zip(*polygon.exterior.coords)
x, y = transformer.transform(x, y)

polygon_v2 = Polygon(zip(x, y))
L = polygon_v2.length

Output:

print(L)
​#560.2377719253593

讓我們從計算以公里為單位的測地距離的 function 開始。

from geographiclib.geodesic import Geodesic

def dkm(frLat, frLon, toLat, toLon):
    """
    Compute geodesic length in kilometers
    Lat, long of point1: frLat, frLon
    Lat, long of point2: toLat, toLon
    """
    #print("frLon,frLat,toLon,toLat:", frLon, "|", frLat, "|", toLon, "|", toLat)
    dist = Geodesic.WGS84.Inverse(frLat, frLon, toLat, toLon)
    return dist["s12"] / 1000

polygon object繼續工作,工作代碼:

# ...
segleng = [0]
eaold = []
for ix,ea in enumerate(polygon.exterior.coords):
    if ix>0:
        frLat, frLon = eaold
        toLat, toLon = ea
        gccdist_km = dkm(frLat, frLon, toLat, toLon)
        segleng.append(gccdist_km)
        print(f"Segment:{ix:3.0f}   Length_km:{gccdist_km:9.4f}   Cumulative_dist:{sum(segleng):9.4f}")
    eaold = ea
Segment:  1   Length_km:   0.1242   Cumulative_dist:   0.1242
Segment:  2   Length_km:   0.0739   Cumulative_dist:   0.1981
Segment:  3   Length_km:   0.0535   Cumulative_dist:   0.2516
Segment:  4   Length_km:   0.1333   Cumulative_dist:   0.3849
Segment:  5   Length_km:   0.2112   Cumulative_dist:   0.5961

結論:

# Sum of segment distances in meters
print(f"Total distance: {sum(segleng)*1000:9.3f} meters")
Total distance:  596.069 meters

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM