AsTopoJSON — opoGeometryのTopoJSON表現を返します。
text AsTopoJSON(
topogeometry tg, regclass edgeMapTable)
;
TopoGeometryのTopoJSON表現を返します。edgeMapTable
がNULLでない場合には、エッジ識別番号とアーク添え字のルックアップと格納のマッピングに使われます。これは、最終的な文書内のコンパクトな"arcs"配列ができるようにするためです。
このテーブルは、与えられた場合には、"serial"型の"arc_id"カラムと整数型の"edge_id"とを持つことが期待されます。関数はこのテーブルに"edge_id"を問い合わせるので、このカラムにインデクスを追加することが推奨されます。
TopoJSONでのアークのインデックスは0始まりですが、"edgeMapTable"テーブルでは1始まりです。 |
完全なTopoJSON文書は、この関数が返すスニペットだけでなく、実際のarcsメンバと、いくつかのヘッダを含む必要があります。 TopoJSON specificationをご覧ください。
Availability: 2.1.0
Enhanced: 2.2.1 点入力に対応するようになりました
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]] ]}