我想使用pint将度(地理CRS中的距离)转换为海里。
对于epsg:4326,https://geopandas.org/docs/reference/api/geopandas.GeoDataFrame.sjoin_nearest.html以度为单位输出距离。
由于赤道到极点的距离(以纳米为单位)不同,我不确定这是否可能。
我可以使用1°~= 111 km ~= 60 nm的经验法则。
也许可以使用起点和距离来计算,如下所示:https://github.com/anitagraser/movingpandas/blob/master/movingpandas/geometry_utils.py#L38
下面的代码也很有用:https://geopy.readthedocs.io/en/stable/#module-geopy.distance
下面是一些要测试的代码:
import pandas as pd
import geopandas as gpd
df = pd.DataFrame({"lon": [0], "lat": [0]})
gdf_pt = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df["lon"], df["lat"]), crs="epsg:4326")
df2 = pd.DataFrame({"lon": [1, 2], "lat": [0, 0]})
gdf_pts = gpd.GeoDataFrame(df2, geometry=gpd.points_from_xy(df2["lon"], df2["lat"]), crs="epsg:4326")
value = gdf_pt.sjoin_nearest(gdf_pts, distance_col="distances")["distances"].values[0]
import pint
l = value * ureg.arcdegree发布于 2021-10-26 19:06:50
这个函数是我从现有代码中提取的,它以米为单位计算两个经纬度集合之间的距离。"rlat“和"rlong”是以弧度表示的;您必须从度转换。要获得nm而不是米,只需将R设置为3440即可。
from math import *
# Radius of the earth, in meters.
R = 6371000
# Return distance between two lat/longs.
def distance( pt1, pt2 ):
rlat1 = pt1.rlat
rlat2 = pt2.rlat
dlat = pt2.rlat - pt1.rlat
dlong = pt2.rlong - pt1.rlong
a = sin(dlat/2) * sin(dlat/2) + cos(rlat1) * cos(rlat2) * sin(dlong/2) * sin(dlong/2)
c = 2 * atan2(sqrt(a), sqrt(1-a))
return R * c发布于 2021-10-28 02:06:38
如果可以的话,最好把它扔给墨卡托,然后使用它。
import pint_pandas
gdf = gdf_pt.to_crs("EPSG:3395").sjoin_nearest(gdf_pts.to_crs("EPSG:3395"), distance_col="distances")
gdf["distance"] = gdf["distance"].astype("pint[meter]").pint.to("nautical_mile")https://stackoverflow.com/questions/69711826
复制相似问题