나는 현재 isochrones 및 기본 알고리즘 분야에서 일하고 있습니다. 이제 문제를 일으키는 것은 isochrone 자체의 계산이 아니라 결과의 시각화입니다.
내 isochrone 알고리즘의 결과는 점과 가장자리입니다. 실제로 작동하는 솔루션이 있지만 3873 엣지와 1529 노드의 경우 영원히 걸리는 것처럼 보입니다 (2015 Core i7 CPU와 매우 빠른 SSD를 포함하는 Lenovo T440s 랩톱에서 약 2.0 초). 몇 초 대신 msec :-)와 같은 것을 원합니다.
어쩌면 누군가 도달 할 수있는 영역을 시각화하는 다각형을 만드는 데 필요한 계산 시간을 줄이는 데 도움이 될 수 있습니다.
잠깐만 ... 먼저 먼저!
다음은 내가 isochrone의 계산 결과 인 모서리를 시각화 한 것입니다.
이 모서리는 PostGIS 데이터베이스 테이블에 저장되며 간단한 선 스트링입니다.
사용자에게 보여주고 싶은 것은 다음과 같습니다 : 그림의 가장 남쪽과 동쪽의 연결이 끊어진 부분에 주목하십시오. 이들은 별도의 영역으로 그려야합니다 (따라서 병합은 허용되지 않습니다 :-)).
현재이 쿼리를 사용하고 있습니다 :
SELECT ST_AsGeoJson(St_Transform(ST_Multi(ST_Collect(polygons)), 4326)) AS coverage FROM (
SELECT ST_MakePolygon(ST_ExteriorRing(ST_GeometryN(segments, generate_series(1, ST_NumGeometries(segments))))) AS polygons FROM (
SELECT ST_Union(ST_Buffer("GEOMETRY", 20, 'quad_segs=2')) AS segments FROM my_edges AS a
) AS b
) AS c
나는 이미 몇 가지 실험을했고 많은 문서를 읽었지만 더 나은 해결책을 찾을 수는 없습니다.
내 눈에 가장 큰 문제는 ST_Union의 사용법입니다 (문서에 명시된 바와 같이이 기능이 느릴 수 있습니다). 가장 흥미로운 점은 ST_Collect로 대체하면 ST_Buffer 계산 속도가 느려져 모든 쿼리에서 가장자리 사이의 영역을 채우지 않지만 다음 쿼리는 훨씬 오래 걸립니다. ) :
SELECT ST_AsGeoJson(St_Transform(ST_Multi(ST_Collect(polygons)), 4326)) AS coverage FROM (
SELECT ST_Buffer(ST_Collect(ST_LineMerge("GEOMETRY")), 20, 'quad_segs=2') AS polygons FROM my_edges AS a
) AS b
내 시스템에서 약 3.8 초가 걸리므로 시간이 거의 두 배가 걸립니다. 이 작은 벤치 마크에서 첫 번째 결론은 ST_Buffer가 MultiLineStrings와 관련하여 예기치 않게 느려진다는 것입니다 (각 라인마다 버퍼를 만들고 버퍼를 병합 할 때보 다 느립니다)-내 눈에는 이상합니다)
나는 또한 pgRouting에서 구현을 사용하여 알파 셰이프를 사용하려고 시도했지만 설정할 알파 값이 없기 때문에 (그리고 실제로는 실제로 어떤 값으로 설정하지 않을 것인지) 하나의 큰 다각형을 얻습니다 ( 그래서 나는 남쪽과 동쪽의 지역을 내가 원하는 것이 아닌 별도의 지역으로 잃을 것입니다).
또한 ST_Polygonize (내 생각에 가장 먼저 나온 것)는 사용 가능한 결과를 얻지 못했지만 여기서 뭔가를 놓쳤을 수도 있습니다 ...
PostGIS에 표시된 영역을 만드는 더 좋은 방법이 있습니까? 아마도 자바 코드 (jts) 또는 클라이언트 측 자바 스크립트 코드 (jsts)를 사용하여? 사실 결과에 표시된 영역이 분리되어 있고 계산 속도가 훨씬 빠르면 세부 사항을 잃어 버릴 수 있습니다.