AsTopoJSON — TopoGeometry의 TopoJSON 표현식을 반환합니다.
text AsTopoJSON(topogeometry tg, regclass edgeMapTable);
TopoGeometry의 TopoJSON 표현식을 반환합니다. edgeMapTable 이 NULL이 아닐 경우, 경계선 식별자를 원호(arc) 인덱스에 매핑하는 탐색/저장(lookup/storage)으로 쓰일 것입니다. 최종 문서에 조밀한(compact) "원호" 배열을 사용할 수 있게 하기 위해서입니다.
테이블을 설정할 경우, 테이블이 "순차(serial)" 유형 "arc_id" 항목과 정수형 "edge_id" 항목을 가지고 있어야 합니다. 코드가 "edge_id"에 대해 테이블을 쿼리할 것이므로 해당 항목에 인덱스를 추가하는 편이 좋습니다.
![]() | |
TopoJSON 출력물에서는 원호 인덱스가 0-기반이지만 "edgeMapTable" 테이블에서는 1-기반입니다. |
완전한 TopoJSON 문서는, 이 함수가 반환하는 토막 정보(snippet)에 더해, 일부 헤더와 함께 실제 원호를 담고 있어야 할 것입니다. TopoJSON 사양서 를 참조하십시오.
2.1.0 버전부터 사용할 수 있습니다.
개선 사항: 2.2.1 버전부터 점형(puntal) 입력을 지원하기 시작했습니다.
CREATE TEMP TABLE edgemap(arc_id serial, edge_id int unique);
-- header
SELECT '{ "type": "Topology", "transform": { "scale": [1,1], "translate": [0,0] }, "objects": {'
-- objects
UNION ALL SELECT '"' || feature_name || '": ' || AsTopoJSON(feature, 'edgemap')
FROM features.big_parcels WHERE feature_name = 'P3P4';
-- arcs
WITH edges AS (
SELECT m.arc_id, e.geom FROM edgemap m, city_data.edge e
WHERE e.edge_id = m.edge_id
), points AS (
SELECT arc_id, (st_dumppoints(geom)).* FROM edges
), compare AS (
SELECT p2.arc_id,
CASE WHEN p1.path IS NULL THEN p2.geom
ELSE ST_Translate(p2.geom, -ST_X(p1.geom), -ST_Y(p1.geom))
END AS geom
FROM points p2 LEFT OUTER JOIN points p1
ON ( p1.arc_id = p2.arc_id AND p2.path[1] = p1.path[1]+1 )
ORDER BY arc_id, p2.path
), arcsdump AS (
SELECT arc_id, (regexp_matches( ST_AsGeoJSON(geom), '\[.*\]'))[1] as t
FROM compare
), arcs AS (
SELECT arc_id, '[' || array_to_string(array_agg(t), ',') || ']' as a FROM arcsdump
GROUP BY arc_id
ORDER BY arc_id
)
SELECT '}, "arcs": [' UNION ALL
SELECT array_to_string(array_agg(a), E',\n') from arcs
-- footer
UNION ALL SELECT ']}'::text as t;
-- Result:
{ "type": "Topology", "transform": { "scale": [1,1], "translate": [0,0] }, "objects": {
"P3P4": { "type": "MultiPolygon", "arcs": [[[-1]],[[6,5,-5,-4,-3,1]]]}
}, "arcs": [
[[25,30],[6,0],[0,10],[-14,0],[0,-10],[8,0]],
[[35,6],[0,8]],
[[35,6],[12,0]],
[[47,6],[0,8]],
[[47,14],[0,8]],
[[35,22],[12,0]],
[[35,14],[0,8]]
]}