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

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


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


有人可以解释为什么空间视图无法加载到QGIS中,以及我需要做些什么才能使其在QGIS中作为层加载吗? m目前正在使用OSGEO安装程序中的QGIS v1.8

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

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

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


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

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


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

评论

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

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

@Pgimenez,我建议您使用上面所说的内容开始一个新问题,然后自己引用该问题的URL。这将使它具有更大的可见性。

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

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

#1 楼

我可以确认不可能只选择一个列出的视图。

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



评论


哇,我再也见不到。非常感谢!我已经编辑标题以反映问题出在QGIS,而不是PostGIS视图。

– RyanKDalton
2012年5月18日22:03



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

– Mike T
2012年5月19日在21:54

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

– Underdark♦
2012年9月3日上午11:14

在旁注@ underdark,QGIS是否接受其他类型的PK?

–乔治·席尔瓦(George Silva)
2012年11月9日15:49

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

–罗素·富尔顿(Russell Fulton)
18年4月7日在20:46

#2 楼

(略微更新我的答案)

只要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字段移到视图的开头解决了该问题! br />

评论


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

– RyanKDalton
16年9月9日在21:03

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

– DPSSpatial
16年11月9日在22:18

GID对此没有任何影响...

– DPSSpatial
16年11月9日在22:54

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

– RyanKDalton
16年11月10日,3:25

(与此相关,但是...)大概是这样,我认为如果正在加载的表定义了PRIMARY KEY,则QGIS会常规地将其拾取:它不会失败地“拾取”我的任何表有一个PK,尽管我几乎所有的PK都是VARCHAR。使用VIEW不会发生这种情况,因为PostgreSQL VIEW不能有CONSTRAINT。完全确定这就是为什么在通过“添加PostGIS图层”按钮导入QGIS时必须手动选择VIEW的PK的原因,这就是为什么我使用Python脚本导入它们的原因。

– GT。
17年2月14日在1:27

#3 楼

您的视图显示在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

– RyanKDalton
2012年5月18日18:37



#4 楼

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

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

评论


是的,地理名称表具有唯一的ID“ geonameid”,并且在该字段上设置了PRIMARY KEY约束。

– RyanKDalton
2012年5月18日18:41