在PostGIS中制作空间视图并将其添加为QGIS中的图层?


49

在PostGIS 2.0中,我正在寻求一种有效的方法来创建在QGIS中可见的具有空间功能的视图。

我遵循了@Mike Toews的第2部分的内容,答案是如何从Postgis DB中的现有表(应用新模式)创建表?,并且该视图在“添加PostGIS图层”对话框中显示为点图层(在我的情况下)。但是在创建视图并在空间上启用它后,尝试将视图添加到QGIS时收到以下错误:

您必须选择一个表格才能添加图层

有人可以解释为什么空间视图不能加载到QGIS中,以及我需要做些什么才能使其在QGIS中作为层加载吗?

我目前正在使用OSGEO安装程序中的QGIS v1.8

我查看是从地理名称数据库构建的,并加载到PostGIS中。可以在QGIS中选择/查看地名表/空间数据。

当我尝试选择“ mt_view ”时,QGIS会在对话框中看到该视图,但不允许我选择它。它在该区域周围提供了一个虚线框,但未突出显示并选择视图。

QGIS无法选择mt_view作为图层


我只是注意到,当我运行第一个查询时:

CREATE OR REPLACE VIEW data.test AS
SELECT * FROM data.geoname
WHERE admin1='MT'

该视图显示在“ QGIS添加图层”对话框中,但无法选择。然后,当我运行时:

SELECT Populate_Geometry_Columns('data.test'::regclass);

我得到的结果为“ 0”,根据文档,我认为它应该返回“ 1”。


1
我确认了问题。使用QGIS 1.8,PostGIS 2.0和使用主键从表创建的视图,该视图会在可用层中列出,但是会出现错误消息“您必须选择表才能添加层”。
giohappy 2012年

2
当我们使用视图时,还有其他方法可以在Postgis“添加图层”窗口中自动设置主键吗?如果您想象一个普通的GIS用户和一个视图有很多整数字段,那么在此屏幕上为任何图层/视图选择一个主键字段是非常困难的。

@Pgimenez,我建议您使用上面所说的内容开始一个新问题,然后自己引用这个问题的URL。这将使它具有更大的知名度。
RyanDalton 2012年

没有办法在qgis 1.8 lisboa中可视化凸包?我曾尝试按照Postgis 1.5中的viev进行操作,有人告诉我使用id列在Qgis中发布它。如果您不使用id列,则由于错误,您仍然无法加载它。1.创建或替换视图con_hull_baeume3(bid)为baeume中的“ 0”,ST_ConvexHull(ST_Collect(geom))选择;2.创建或替换视图con_hull_baeume4(bid)作为选择投标,从baeume组按投标选择ST_ConvexHull(ST_Collect(geom));但是这个在每个几何点上都做成了凸包。我的意思是只使用'从baeume中选择ST_ConvexHull(ST_Collect(geom));' 作品
ulan

1
欢迎!请将此问题发布为新问题,因为它似乎无法回答原始问题。至少是一个问题,因为最后的陈述不清楚您是否成功。
lynxlynxlynx

Answers:


54

我可以确认无法简单地选择列出的视图。

似乎有必要首先选择“主键列”。然后表格变为可选状态:

在此处输入图片说明


1
哇,我再也见不到。非常感谢!我已经编辑标题以反映问题出在QGIS,而不是PostGIS视图。
瑞安·道尔顿(RyanDalton)2012年

看来这是QGIS 1.8的问题(我尚未使用过)。1.7不需要这些步骤。
Mike T

没错,1.7试图猜测主键。但是效果不佳。
昏暗

在旁注@ underdark,QGIS是否接受其他类型的PK?
乔治席尔瓦

1
在QGIS3中,该列的标题为“功能ID”,而不是“主键列”,并且(至少对我而言)该列不在默认窗口的边缘(即不可见),并且不表示还有更多列!我认为我将记录一项功能请求,要求用户在选择后获得这些详细信息的提示(如果需要)。开发人员似乎认为人们会确保第一列中有唯一的键。
罗素富尔顿

5

(略微更新我的答案)

只要OBJECTID(row_number)字段在视图的列定义中排在第一位,QGIS就会选择它,而不会要求您从“添加矢量层”菜单中添加。

CREATE OR REPLACE VIEW dqmt.addressverify AS 
 SELECT row_number() OVER (ORDER BY newaddresses.addressid) AS objectid,
    newaddresses.addressid
  , geom
   FROM dqmt.newaddresses;

我只是修复了一些按照原始问题被破坏的旧视图,但是将OBJECTID字段移到视图的开头解决了该问题!


我也对许多视图使用了“ row_number()over()”语法。我通常在主键字段中使用“ gid”。您所有其他视图是否都将“ objectid”用作其主键?
瑞安·道尔顿

通常是objectid-在上面的示例中起作用-但是会尝试gid ...是QGIS在其他“ id”字段之前识别出的东西吗?
DPSSpatial

GID对此没有任何影响……
DPSSpatial

只是梦想着可能性。感谢您的检查
RyanDalton

(与此类似,但是...)我猜想是,如果正在加载的表具有PRIMARY KEY定义,则QGIS会常规地将其拾取:它不会失败地“拾取”我的任何具有PK,尽管几乎所有我的PK都是VARCHAR。这是不可能发生的,VIEW因为PostgreSQL VIEW不能拥有CONSTRAINT。完全确定这就是为什么VIEW在通过“添加PostGIS图层”按钮导入QGIS时需要手动选择s 的PK的原因,这就是为什么我使用Python脚本导入它们的原因。
GT。

4

您的视图显示在geometry_columns表格中吗?根据手册,该视图应在2.0中自动显示,但我没有尝试过。

尝试运行以下命令进行检查:

SELECT f_geometry_column As col_name, type, srid, coord_dimension As ndims 
FROM geometry_columns
WHERE f_table_name = 'my_spatial_table' AND f_table_schema = 'my_schema';

是的,针对我的视图运行此检查确实会返回:the_geom,Point,4269,2
RyanDalton 2012年

3

您的视图中是否使用了视图中表之一中的唯一整数字段(例如“ gid”或PK等效项)?

我知道在以前的QGIS版本中,当没有唯一的整数字段时,在将视图添加到地图时遇到了问题。但是,我确实收到了一条不同的错误消息,指出了该问题,但是掩盖所有基础可能值得检查。


是的,地名表具有唯一的ID“ geonameid”,并且在该字段上设置了PRIMARY KEY约束。
瑞安·道尔顿(RyanDalton)2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.