RTree에서 공간 인덱스 사용을 이해하는 데 문제가 있습니다.
예 : 300 개의 버퍼 포인트가 있으며 다각형 모양 파일로 각 버퍼의 교차 영역을 알아야합니다. 다각형 shapefile에는> 20,000 개의 다각형이 있습니다. 공간 인덱스를 사용하여 프로세스 속도를 높이는 것이 좋습니다.
SO ... 폴리곤 쉐이프 파일에 대한 공간 인덱스를 만들면 어떤 방식으로 파일에 "첨부"됩니까, 아니면 인덱스가 독립적입니까? 즉, 폴리곤 파일에서 교차 기능을 실행하고 더 빠른 결과를 얻을 수 있습니까? 교차점은 공간 지수가 있고 무엇을해야하는지 알 수 있습니까? 또는 인덱스에서 실행 한 다음 FID 등을 통해 해당 결과를 원래 다각형 파일과 다시 관련시켜야합니까?
RTree 설명서는별로 도움이되지 않습니다 (아마도 프로그래밍을 배우기 때문일 것입니다). 수동으로 생성 된 포인트를 읽은 다음 인덱스를 생성하여 다른 수동으로 생성 된 포인트와 쿼리하여 창에 포함 된 ID를 반환하는 방법을 보여줍니다. 말이된다. 그러나 그들은 인덱스가 나온 원본 파일과 어떻게 관련이 있는지 설명하지 않습니다.
나는 다음과 같이 가야한다고 생각합니다.
- 폴리곤 쉐이프 파일에서 각 폴리곤 피처에 대한 bbox를 가져와 공간 인덱스에 배치하여 쉐이프 파일의 id와 동일한 id를 지정합니다.
- 교차하는 ID를 얻으려면 해당 인덱스를 쿼리하십시오.
- 그런 다음 인덱스를 쿼리하여 식별 한 원래 shapefile의 피처에 대해서만 교차점을 다시 실행하십시오 (마지막 부분을 어떻게 수행할지 확실하지 않음).
올바른 아이디어가 있습니까? 아무것도 빠졌습니까?
현재이 코드를 하나의 점 피쳐 만 포함하는 하나의 점 shapefile과 20,000 개 이상의 다각형 피쳐를 포함하는 하나의 다각형 shapefile에서 작동 시키려고합니다.
Fiona를 사용하여 shapefile을 가져오고 RTree를 사용하여 공간 인덱스를 추가하고 Shapely를 사용하여 교차를 시도하고 있습니다.
내 테스트 코드는 다음과 같습니다.
#point shapefile representing location of desired focal statistic
traps = fiona.open('single_pt_speed_test.shp', 'r')
#polygon shapefile representing land cover of interest
gl = MultiPolygon([shape(pol['geometry']) for pol in fiona.open('class3_aa.shp', 'r')])
#search area
areaKM2 = 20
#create empty spatial index
idx = index.Index()
#set initial search radius for buffer
areaM2 = areaKM2 * 1000000
r = (math.sqrt(areaM2/math.pi))
#create spatial index from gl
for i, shape in enumerate(gl):
idx.insert(i, shape.bounds)
#query index for ids that intersect with buffer (will eventually have multiple points)
for point in traps:
pt_buffer = shape(point['geometry']).buffer(r)
intersect_ids = pt_buffer.intersection(idx)
그러나 TypeError : 'Polygon'객체를 호출 할 수 없습니다.
TypeError: 'Polygon' object is not callable
를 덮어 쓰기 때문에 업데이트 예제를 계속 shape
사용할 수 있습니다.for i, shape in enumerate(gl):