AsTopoJSON — Devuelve la representación TopoJSON de una topogeometry.
text AsTopoJSON(
topogeometry tg, regclass edgeMapTable)
;
Devuelve la representación TopoJSON de un topogeometry. Si edgeMapTable
no es nulo, se utilizará como una asignación de búsqueda/almacenamiento de identificadores de arista para los índices de arco.. Esto es para poder permitir un array compacto de "arcos" en el documento final.
Se espera que la tabla, si se da, tenga un campo "arc_id" de tipo "serial" y un "edge_id" de tipo entero; el código consultará la tabla para "edge_id", por lo que se recomienda agregar un índice en ese campo.
Los índices de arco en la salida TopoJSON son de base 0, pero están en base 1 en la tabla "edgeMapTable". |
Un documento completo de TopoJSON será necesario contener, además de los fragmentos devueltos por esta función, los arcos reales más algunos encabezados. Ver también la especificación TopoJSON.
Disponibilidad: 2.1.0
Mejora: 2.2.1 agrega soporte para entradas puntuales.
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]] ]}