지리 공간 인덱싱 함수
시공간 라이브러리를 사용하면, 위치 분석 시 해당 데이터에 대한 빠른 쿼리를 수행하기 위해 특정 영역 내의 점, 점이 포함된 영역, 또는 반경 내의 점을 색인화하는 함수를 활용할 수 있습니다.
공간 인덱스를 생성하고 사용하려면 다음 단계를 수행하십시오. 이 예제는 공간 인덱스를 활용하여 특정 위치에 대한 쿼리를 통해 미국 카운티를 찾는 방법을 보여줍니다.
군 경계를 확인하세요. 이를 위해, 미국 카운티 경계가 포함된 ` GeoJSON ` 파일을 pandas의 ` DataFrame ` 객체로 읽어온
geojson_reader다음, 내용의 첫 세 줄을 표시해 보겠습니다:! wget -q http://eric.clst.org/assets/wiki/uploads/Stuff/gz_2010_us_050_00_20m.json county_df = geojson_reader.read('gz_2010_us_050_00_20m.json') county_df.head(3)카운티 공간 인덱스를 생성합니다.
pyst,r_star_tree_index및 등을 포함한 여러 공간tessellation_index인덱싱grid_index알고리즘을 제공합니다. 이 예제는 테셀레이션 인덱스를 생성하는 방법을 보여줍니다.테셀레이션 공간 인덱스를 생성하려면 다음 두 가지 매개변수를 설정해야 합니다:
바운딩 박스 : 공간 인덱스의 경계를 정의합니다. 지오메트리의 정확한 위치를 알고 있으며, 이 모든 지오메트리를 포함하는 경계를 정의할 수 있다면, 생성해야 할 타일의 수를 줄여 성능을 향상시킬 수 있으므로 이 바운딩 박스 정보를 함수에 전달해야 합니다. 하지만 지형 정보를 알지 못하거나, 주어진 경계 상자 밖으로 벗어날 가능성이 있는 지형을 배제하지 않기 위해 안전을 기하고 싶은 경우(두 경우 모두 매우 흔한 상황입니다), 매개변수
bbox설정을 기본값인 으로None그대로 두기만 하면 지구 전체를 경계 상자로 사용할 수 있습니다.타일 크기 : 테셀레이션 인덱스 내 타일의 크기를 정의합니다. 이 값은 타일의 길이를 미터 단위로 나타낸 것입니다. 성능을 높이기 위해서는 타일 크기를 지오메트리 크기와 비슷하게 설정해야 합니다. 예를 들어, 지오메트리 크기가 100× km2 (즉, 10^8× m2 )인 경우, 타일 크기로 10^4m를 설정하는 것이 적절할 수 있습니다.
바운딩 박스와 타일 크기를 설정하면 이제 공간 인덱스를 생성하고 지오메트리를 해당 공간 인덱스로 가져올 수 있습니다. 이
from_df함수를 사용하여 pandas의 ` DataFrame `에 포함된 지오메트리를 공간 인덱스로 이동합니다. 이를 위해서는 지오메트리 ID 열의 이름과 지오메트리 열의 이름만 지정하면 됩니다. 로그 처리를 제어하는 세 번째 매개변수인verbosity를 로 설정하여 요약error로그와 오류 로그만 표시되도록 하십시오.>>> tile_size = 100000 >>> si = stc.tessellation_index(tile_size=tile_size) # we leave bbox as None to use full earth as boundingbox >>> si.from_df(county_df, 'NAME', 'geometry', verbosity='error') 3221 entries processed, 3221 entries successfully added
공간 인덱스 쿼리를 실행합니다. 공간 인덱스를 쿼리하기 위해 다음의 다양한 쿼리 API를 제공합니다
pyst:contained_in,contained_in_with_info,containing,containing_with_info,intersects,intersects_with_info,within_distancewithin_distance_with_info,,nearest_neighbors,nearest_neighbors_with_info.예시 쿼리:
화이트 플레인스 병원은 어느 카운티에 속해 있나요? 화이트 플레인스 병원의 위치가 어느 카운티의 행정구역 내에 포함되어 있습니까?
>>> white_plains_hospital = stc.point(41.026132, -73.769585) >>> si.containing(white_plains_hospital) ['Westchester']화이트 플레인스 시는 어느 카운티에 위치해 있나요? 화이트 플레인스의 다각형을 포함하는 카운티 다각형은 어디인가요?
>>> white_plains_WKT = 'POLYGON((-73.792 41.024,-73.794 41.031,-73.779 41.046,-73.78 41.049,-73.779 41.052,-73.776 41.054,-73.775 41.057,-73.767 41.058,-73.769 41.062,-73.768 41.067,-73.762 41.073,-73.759 41.074,-73.748 41.069,-73.746 41.056,-73.742 41.056,-73.74 41.053,-73.74 41.049,-73.749 41.04,-73.748 41.035,-73.739 41.034,-73.729 41.029,-73.725 41.025,-73.72 41.016,-73.717 41.015,-73.716 41.006,-73.718 41.002,-73.732 40.988,-73.732 40.985,-73.739 40.979,-73.745 40.978,-73.749 40.981,-73.749 40.986,-73.751 40.986,-73.756 40.991,-73.759 40.991,-73.76 40.993,-73.765 40.994,-73.769 40.997,-73.774 41.002,-73.775 41.006,-73.788 41.018,-73.792 41.024))' >>> wkt_reader = stc.wkt_reader() >>> white_plains = wkt_reader.read(white_plains_WKT) >>> si.containing(white_plains) ['Westchester']화이트 플레인스 시는 어느 카운티에 위치해 있나요? 그 결과 값, 기하 구조, 거리를 포함하는 튜플 목록이 생성됩니다.
>>> si.containing_with_info(white_plains) [('Westchester', MultiPolygon(Polygon: Boundary: Ring(LineSegment(Point(40.886299, -73.767176), Point(40.886899, -73.767276)), LineSegment(Point(40.886899, -73.767276), Point(40.887599, -73.768276)), LineSegment(Point(40.887599, -73.768276), Point(40.888399, -73.770576)), ...) Interiors: , Polygon: Boundary: Ring(LineSegment(Point(41.198434, -73.514617), Point(41.200814, -73.509487)), LineSegment(Point(41.200814, -73.509487), Point(41.21276, -73.482709)), LineSegment(Point(41.21276, -73.482709), Point(41.295422, -73.550961)), ...) Interiors: ), 0.0)]화이트 플레인스 병원에서 가장 가까운 3개 카운티는 어디인가요? 결과에는 각 거리도 포함되어 있습니다.
>>> counties = si.nearest_neighbors_with_info(white_plains_hospital, 3) >>> for county in counties: ... print(county[0], county[2]) Westchester 0.0 Fairfield 7320.602641166855 Rockland 10132.182241119823화이트 플레인스 병원에서 20km 이내에 있는 카운티는 어디인가요? 결과는 거리 순으로 정렬됩니다.
>>> counties = si.within_distance_with_info(white_plains_hospital, 20000) >>> counties.sort(key=lambda tup: tup[2]) >>> for county in counties: ... print(county[0], county[2]) Westchester 0.0 Fairfield 7320.602641166855 Rockland 10132.182241119823 Bergen 10934.1691335908 Bronx 15683.400292349625 Nassau 17994.425235412604