Name

AsTopoJSON — Devuelve la representación TopoJSON de una topogeometry.

Synopsis

text AsTopoJSON(topogeometry tg, regclass edgeMapTable);

Descripción

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.

[Note]

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.

Ver también

ST_AsGeoJSON

Ejemplos

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]]
 ]}