获取两个Geopandas数据框几何点之间的距离

我是第一次使用空间数据。我必须比较两个具有延迟和冗长细节的数据框。我已经将它们都转换为GeoPandas数据框。

import pandas as pd
from pandas import DataFrame
import geopandas as gpd
from neighbors import nearest_neighbor


df = pd.DataFrame([[1973,22.525158,88.330775],[1976,72.85136,19.10840],[898,91.78523,26.15012]],columns=['id', 'lat', 'long'])
gdf1 = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df.long,df.lat))

df2 = pd.DataFrame([['06c979eaa59f',29.873870,76.965620],['19aedbb2e743',20.087574,76.180045],['5060a3931a43',31.289770,75.572340]],columns=['id','lat','lon']) 
gdf2 = gpd.GeoDataFrame(df2, geometry=gpd.points_from_xy(df2.lon,df2.lat))

我的DF1有100万行,而df2有7000行。我正在尝试从DF2中获取DF1中的每个记录的最近邻居。

我尝试了两种方法。两者都运行非常快,结果可行。但是,它们不准确。

方法1:

请检查此链接

在此页面中,我使用的最接近邻居方法sklearn.neighbors这将以米为单位返回结果。但是,当我手动检查两个数据帧的经纬度之间的距离时,我总是发现最近的邻居返回距离的1/4。

例如,如果上述方法返回的距离为125米,则Google地图和https://www.geodatasource.com/distance-calculator均返回500米左右的距离。距离之差保持在返回结果的4倍左右波动。

方法2:

在第二种方法中,我遵循gis.stackexchange.com中给出的代码。

https://gis.stackexchange.com/questions/222315/geopandas-find-nearest-point-in-other-dataframe

import itertools
from operator import itemgetter

import geopandas as gpd
import numpy as np
import pandas as pd

from scipy.spatial import cKDTree
from shapely.geometry import Point, LineString

df = pd.DataFrame([[1973,22.525158,88.330775],[1976,72.85136,19.10840],[898,91.78523,26.15012]],columns=['id', 'lat', 'long'])
gdf1 = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df.long,df.lat))

df2 = pd.DataFrame([['06c979eaa59f',29.873870,76.965620],['19aedbb2e743',20.087574,76.180045],['5060a3931a43',31.289770,75.572340]],columns=['id','lat','lon']) 
gdf2 = gpd.GeoDataFrame(df2, geometry=gpd.points_from_xy(df2.lon,df2.lat))

在此,我用自己的数据帧替换了gpd1和gpd2。

def ckdnearest(gdfA, gdfB, gdfB_cols=['id']):
    # resetting the index of gdfA and gdfB here.
    gdfA = gdfA.reset_index(drop=True)
    gdfB = gdfB.reset_index(drop=True)
    A = np.concatenate(
        [np.array(geom.coords) for geom in gdfA.geometry.to_list()])
    B = [np.array(geom.coords) for geom in gdfB.geometry.to_list()]
    B_ix = tuple(itertools.chain.from_iterable(
        [itertools.repeat(i, x) for i, x in enumerate(list(map(len, B)))]))
    B = np.concatenate(B)
    ckd_tree = cKDTree(B)
    dist, idx = ckd_tree.query(A, k=1)
    idx = itemgetter(*idx)(B_ix)
    gdf = pd.concat(
        [gdfA, gdfB.loc[idx, gdfB_cols].reset_index(drop=True),
         pd.Series(dist, name='dist')], axis=1)
    return gdf

c = ckdnearest(gdf1, gdf2)

上面的程序运行非常快,并返回结果。但是,返回的距离值至少比我得到的值低100倍。

乘数:107.655914

在此处输入图片说明

在上面的excel图片中,第一列表示python返回的结果,而第二列表示由上述相同网站返回的结果。这些结果的近似值让我起步时,我想要准确的结果。如何比较上面给出的两个数据帧,并获得DF1中每一行的最准确的最近距离。

藏族

使用空间数据时,应注意将点坐标从球体投影到平面中。在墨卡托投影中,纬度点之间的距离以度为单位,而不是以米为单位。转换取决于点的纬度,因为赤道处的1度将小于高纬度处的1度。

您可以查看此讨论以找到针对该问题的可能解决方案:https : //gis.stackexchange.com/questions/293310/how-to-use-geoseries-distance-to-get-the-right-answer

举一个例子,一种可能性是将地理数据框转换为覆盖您区域的UTM投影。例如,比利时与UTM区域31N EPSG:32631相交墨卡托投影的epsg代码为EPSG:4326。要转换GeoDataFrame / GeoSeries,您需要在创建它时提供CRS:

s = gpd.GeoSeries(points, crs=4326)

点是列表 shapely.geometry.Point

然后转换为给定的UTM:

s_utm = s.to_crs(epsg=32631)

现在,您要计算的点之间的距离将以s_utm米为单位。

但是,您需要确保您的积分确实落在给定的UTM区域内,否则结果将不准确。我链接的答案提出了其他可行的方法,这些方法也可以应用于积分的整体。

您也可以尝试转换为应保留距离的EPSG 32663(WGS 84 /世界等距圆柱)。

可以使用另一个选项geopy,该选项允许使用以下命令计算测地距离geopy.geodesic.distance

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何计算数据框中两个连续点之间的距离和角度?

来自分类Dev

如何计算数据框中两个连续点之间的距离和角度?

来自分类Dev

计算同一数据中两个长点/经点之间的距离

来自分类Dev

计算两个不同分组数据帧中位置点之间的最大距离

来自分类Dev

如何找到 GPS 轨迹数据集中两个相邻点之间的距离(以英尺为单位)?

来自分类Dev

我如何找到两个点/像素之间的距离?

来自分类Dev

如何添加两个点之间的距离(SRID = 32636)?

来自分类Dev

我如何找到两个点/像素之间的距离?

来自分类Dev

计算两个经纬度点之间的距离?

来自分类Dev

计算数据框中两个纬度与经度之间的距离

来自分类Dev

如何找到两个矩形之间最接近的距离的两个点?

来自分类Dev

获取两个标签之间的数据

来自分类Dev

获取两点之间的距离/位移

来自分类Dev

如何计算距离的两个点之间,对很多随之而来的点,蟒蛇组内

来自分类Dev

计算两个数据集(最近邻居)的两点之间的距离

来自分类Dev

Python:获取两个点分数字之间的范围

来自分类Dev

Python:获取两个点分数字之间的范围

来自分类Dev

如何获取包含两个其他值之间的值的数据框的行?

来自分类Dev

如何获取数据框中两个重叠日期之间的范围?

来自分类Dev

获取具有其他两个之间的绝对差异的数据框

来自分类Dev

修改两个div之间的距离

来自分类Dev

两个值之间的距离

来自分类Dev

两个对象之间的欧几里德距离

来自分类Dev

确定两个设备之间的距离

来自分类Dev

计算两个纬度之间的距离

来自分类Dev

修改两个div之间的距离

来自分类Dev

计算Android中两个纬度和经度点之间的距离

来自分类Dev

在Python中测量1000的两个纬度长点之间的距离

来自分类Dev

如何计算两个给定点和给定距离之间的点?

Related 相关文章

  1. 1

    如何计算数据框中两个连续点之间的距离和角度?

  2. 2

    如何计算数据框中两个连续点之间的距离和角度?

  3. 3

    计算同一数据中两个长点/经点之间的距离

  4. 4

    计算两个不同分组数据帧中位置点之间的最大距离

  5. 5

    如何找到 GPS 轨迹数据集中两个相邻点之间的距离(以英尺为单位)?

  6. 6

    我如何找到两个点/像素之间的距离?

  7. 7

    如何添加两个点之间的距离(SRID = 32636)?

  8. 8

    我如何找到两个点/像素之间的距离?

  9. 9

    计算两个经纬度点之间的距离?

  10. 10

    计算数据框中两个纬度与经度之间的距离

  11. 11

    如何找到两个矩形之间最接近的距离的两个点?

  12. 12

    获取两个标签之间的数据

  13. 13

    获取两点之间的距离/位移

  14. 14

    如何计算距离的两个点之间,对很多随之而来的点,蟒蛇组内

  15. 15

    计算两个数据集(最近邻居)的两点之间的距离

  16. 16

    Python:获取两个点分数字之间的范围

  17. 17

    Python:获取两个点分数字之间的范围

  18. 18

    如何获取包含两个其他值之间的值的数据框的行?

  19. 19

    如何获取数据框中两个重叠日期之间的范围?

  20. 20

    获取具有其他两个之间的绝对差异的数据框

  21. 21

    修改两个div之间的距离

  22. 22

    两个值之间的距离

  23. 23

    两个对象之间的欧几里德距离

  24. 24

    确定两个设备之间的距离

  25. 25

    计算两个纬度之间的距离

  26. 26

    修改两个div之间的距离

  27. 27

    计算Android中两个纬度和经度点之间的距离

  28. 28

    在Python中测量1000的两个纬度长点之间的距离

  29. 29

    如何计算两个给定点和给定距离之间的点?

热门标签

归档