A year ago I had modified code from here to make a set of about thirty million hex cells across the continental United States, using the projection from the National Map, EPSG:2163.
Today, topology wizard strk was building a set of hex cells to test conversion to topology in PostGIS 2.0. The question arose, would the hex cells I had built with another method convert cleanly to a topology, and without specifying a tolerance distance?
So I tried converting a subset of the US cells into a topology.
First step, pick a few thousand contiguous hex cells:
-- create one Alameda County multipolygon DROP TABLE if exists alameda_tracts CASCADE; CREATE TABLE alameda_tracts as SELECT 1 as ogc_fid, st_union(wkb_geometry) as wkb_geometry FROM census_2010_tracts WHERE census_2010_tracts.countyfp10 = '001'; ALTER TABLE alameda_tracts add PRIMARY KEY ( ogc_fid ); -- -- transform and compare county to hex cells DROP TABLE if exists some_hex_cells CASCADE; CREATE TABLE some_hex_cells as SELECT distinct on (hex_grid_cells.id, hex_grid_cells.wkb_geometry) hex_grid_cells.id, hex_grid_cells.wkb_geometry FROM public.alameda_tracts, public.hex_grid_cells WHERE ST_Intersects( hex_grid_cells.wkb_geometry, ST_Transform(alameda_tracts.wkb_geometry,2163) ); -- alter table some_hex_cells add primary key (id); create index shc_geom_idx on some_hex_cells USING GIST (wkb_geometry); select count(*) from some_hex_cells; count ------- 5272 (1 row)
In an EXPLAIN ANALYZE
of the collection of the hex cells query above, the postgres scheduler showed a linear scan of the table being transformed, which is one record long, and an index scan on the 30 million hex cells – perfect! Next step, create a PostGIS 2.0 topology in EPSG:2163 :
SELECT CreateTopology('hexagon_topo', 2163 ); -- use DropTopology('hexagon_topo') to start over..
Now, do the conversion to topology, time it, and validate :
\timing SELECT TopoGeo_AddPolygon( 'hexagon_topo', h.wkb_geometry ) FROM some_hex_cells h; thuban1 Time: 636187 ms i7-960+ Time: 239265 ms select TopologySummary('hexagon_topo'); topologysummary --------------------------------------------------------------- Topology hexagon_topo (2), SRID 2163, precision 0 + 10608 nodes, 15879 edges, 5272 faces, 0 topogeoms in 0 layers+
It strikes me as odd that the summary would list “0 topogeoms” but if I recall that means that there are no *heirarchical* topologies. Since TopologySummary()
returned ok, perhaps my one topology is valid. But, ValidateTopology()
returns zero rows ?? I guess there is more to topology to learn, still…
SELECT ValidateTopology('hexagon_topo'); validatetopology ------------------ (0 rows)
PS- just noticed this post