[英]Calculate overlap between polygon and shapefile in Python 3.6
[英]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.