Die materialisierte Ansicht wird in der Geometry_Columns-Ansicht nicht angezeigt

12

Ich habe eine materialisierte Ansicht in einer PostGIS 2.1-fähigen Datenbank mit PostgreSQL 9.3.1 definiert:

CREATE MATERIALIZED VIEW canvec_data.contours_m AS 
 SELECT
    contours_original.ogc_fid, 
    contours_original.elevation::integer AS elevation_orig, 
    CASE
        WHEN "substring"(contours_original.code::text, 1, 3) = '257'::text THEN round(contours_original.elevation::double precision * 0.3048::double precision)
        ELSE contours_original.elevation::double precision
    END AS elevation_m, 
    contours_original.wkb_geometry::geometry(Linestring,3578)
 FROM canvec_data.contours_original

Ich hatte vielleicht fälschlicherweise damit gerechnet, dass diese resultierende Entität (eine Tabelle?) In der public.geometry_columnsAnsicht aufgelistet und somit von GIS-Viewer-Software wie QGIS richtig interpretiert wird.

Die materialisierte Ansicht wird nicht in der public.geometry_columnsAnsicht angezeigt.

Was mache ich falsch?

Vielen Dank!

Joebocop
quelle

Antworten:

16

Wenn Sie nichts falsch machen, haben Sie eine Lücke in unserer Unterstützung für die neue materialisierte Ansichtsfunktion von PostgreSQL 9.3 entdeckt. Ich habe alle relevanten Zweige gepatcht, und Sie können Ihre Definition von geometry_columns selbst aktualisieren (siehe die Änderungsverweise in diesem Ticket http://trac.osgeo.org/postgis/ticket/2511 ).

Folgendes können Sie einfach in das SQL-Fenster einfügen:

CREATE OR REPLACE VIEW geometry_columns AS 
  SELECT current_database()::varchar(256) AS f_table_catalog, 
    n.nspname::varchar(256) AS f_table_schema, 
    c.relname::varchar(256) AS f_table_name, 
    a.attname::varchar(256) AS f_geometry_column, 
    COALESCE(NULLIF(postgis_typmod_dims(a.atttypmod),2),
             postgis_constraint_dims(n.nspname, c.relname, a.attname),
             2) AS coord_dimension, 
    COALESCE(NULLIF(postgis_typmod_srid(a.atttypmod),0),
             postgis_constraint_srid(n.nspname, c.relname, a.attname),
             0) AS srid, 
    -- force to be uppercase with no ZM so is backwards compatible
    -- with old geometry_columns
    replace(
      replace(
        COALESCE(
          NULLIF(upper(postgis_typmod_type(a.atttypmod)::text), 'GEOMETRY'),
          postgis_constraint_type(n.nspname, c.relname, a.attname),
          'GEOMETRY'
        ), 'ZM', ''
      ), 'Z', ''
    )::varchar(30) AS type
  FROM pg_class c, pg_attribute a, pg_type t, pg_namespace n
  WHERE t.typname = 'geometry'::name 
    AND a.attisdropped = false 
    AND a.atttypid = t.oid 
    AND a.attrelid = c.oid 
    AND c.relnamespace = n.oid 
    AND (c.relkind = 'r'::"char" OR c.relkind = 'v'::"char" OR c.relkind = 'm'::"char")
    AND NOT pg_is_other_temp_schema(c.relnamespace)
    AND NOT ( n.nspname = 'public' AND c.relname = 'raster_columns' )
    AND has_table_privilege( c.oid, 'SELECT'::text );
Paul Ramsey
quelle
5
Große Antwort und Verlegenheit; Das ist Kundenservice ...
DEWright