>

큰 점 파일이 있는데 그 점과 다른 점 집합 사이의 거리를 찾으려고합니다. 처음에는 to_crs 를 사용했습니다.   df.distance(point) 할 때 미터 단위로 정확한 거리 측정을 얻을 수 있도록 crs를 변환하는 geopandas의 기능 . 그러나 파일이 매우 크기 때문에 파일의 crs를 변환하는 데 너무 오래 걸렸습니다. 코드가 2 시간 동안 실행되었지만 변환이 완료되지 않았습니다. 따라서이 코드를 대신 사용했습니다.

inProj = Proj(init='epsg:4326')
outProj = Proj(init='epsg:4808')
for index, row in demand_indo_gdf.iterrows():
    o = Point(row['origin_longitude'], row['origin_latitude'])
    o_proj = Point(transform(inProj, outProj, o.x, o.y))
    for i, r in bus_indo_gdf.iterrows():
        stop = r['geometry']
        stop_proj = Point(transform(inProj, outProj, stop.x, stop.y))
        print ('distance:', o_proj.distance(stop_proj), '\n\n')

crs를 개별적으로 변환하고 분석을 수행하는 것이 더 빠를 수 있다고 생각했습니다. 이 포인트 세트의 경우 :

o = (106.901024 -6.229162)
stop = (106.804 -6.21861)

이 EPSG 4326 좌표를 로컬 투영 EPSG 4808로 변환하고 다음을 얻었습니다.

o_proj = (0.09183386384156803 -6.229330112968891)
stop_proj = (-0.005201753272169649 -6.218776788266844)

이것은 거리 측정치가 0.09760780527657992였다. 구글지도는 좌표 o 에 대한 거리 측정을 주었다  그리고 stop 의 10.79km 내 코드의 거리 측정이 실제 거리보다 10 ^ -3 배 더 작은 답변을 제공하는 것처럼 보입니다. 왜 이렇게이다? 내 코드가 맞습니까?


  • 답변 # 1

    사용하는 좌표는 미터가 아닌 각도입니다.

    와이즈 비즈  사용중인 클래스는 아마도 이것에 신경 쓰지 않고 그들 사이의 데카르트 거리를 계산합니다.

    예를 들어 Haversine 방정식을 사용하십시오. 여기에서 하나 :

    Points
    
    

    그러면 코드가 올바른 결과를 반환합니다 :

    from math import radians, cos, sin, asin, sqrt
    def haversine(lon1, lat1, lon2, lat2):
        """
        Calculate the great circle distance between two points 
        on the earth (specified in decimal degrees)
        """
        # convert decimal degrees to radians 
        lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
        # haversine formula 
        dlon = lon2 - lon1 
        dlat = lat2 - lat1 
        a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
        c = 2 * asin(sqrt(a)) 
        r = 6371 # Radius of earth in kilometers. Use 3956 for miles
        return c * r
    
    
    from pyproj import Proj, transform inProj = Proj(init='epsg:4326') outProj = Proj(init='epsg:4808') o = (106.901024, -6.229162) stop = (106.804, -6.21861) o_proj = transform(inProj, outProj, o[0], o[1]) stop_proj = transform(inProj, outProj, stop[0], stop[1]) print(haversine(o_proj[0], o_proj[1], stop_proj[0], stop_proj[1]))

관련 자료

  • 이전 css - 유틸리티 생성을 위해 SASS에서 '빈'클래스 이름 허용
  • 다음 Julia Lang의 현재 변수 목록 가져 오기