如何只显示任意选择项的标签?


10

我很好奇其他人如何解决这个问题:您已经为带有大量带有标签的要素的对象创建了地图。客户/客户要求您仅根据一些看似随意的决定(例如,他们认为重要的功能)显示X,Y和Z的标签。您将如何去做?

一些想法:

  • 为此特殊标签创建一个新的字符串列,并仅为其要查看的功能填写一个值(可能导致信息重复)
  • 创建一个新的布尔列并使用true标记要查看的功能,然后在QGIS 1.8中使用条件标签仅在布尔值为true时显示标签

6
第二个想法有很多优点:(i)清楚地记录了需要标记的内容,(ii)它与基础数据集一样持久且可移植,(iii)提供了一种简单直接的机制来确定将出现哪些标签( (甚至可以移植到另一个GIS或绘图程序包中),(iv)甚至在存在关于标签的这些选择与任何其他变量之间的关系存在疑问的情况下,甚至可以进行分析;以及(v)通过简化编码客户的选择来进行分析,它不会创建重复信息。
whuber

2
@whuber,您能回答这个问题吗,所以我可以投票赞成,因为那正是我要做的方式。
内森(Nathan W)

Answers:


11

第二个想法(创建用于选择的布尔属性)具有许多优点

(i)清楚地记录了需要标记的内容,

(ii)它与基础数据集一样永久且可移植,

(iii)它提供了一种简单直接的机制来确定将显示哪些标签(甚至可以移植到另一个GIS或绘图软件包中),

(iv)如果对这些标签选择与任何其他变量之间的关系存有疑问,甚至可以进行分析;并且

(v)通过简化编码客户的选择,不会产生重复信息。

如问题中的明智建议所述,这里有一些通用的数据库构建和管理原则在起作用。其中之一是,如果可能的话,任何连贯的信息都应在数据库中唯一表示。(用作实现联接和关联的关键字的信息当然必须由于其在不同表中标识相应记录的功能而必须出现在多个位置。)采用该原理的理由很充分,因为任何尝试维护非规范化的人关系数据库可以证明:如果您不总是记得要更新或删除此信息或将其添加到每个 出现在其中的表时,数据库很快就会内部不一致:它已损坏,通常是无法恢复的。

另一个原则是,在良好的关系数据库设计中,每个表应代表一个概念上的“实体”:数据正在建模的事物或这些事物之间的关系。当客户指定看似随意的功能选择时,他们实际上是在指定表中的行子集。在数学上,通过分离公理,这与使用布尔字段标记它们是相同的。因此,数据库中任何有意义的“任意”事物子集都可以由布尔字段表示,相反,这种字段是存储任意子集(或选择)的好方法。

另一个原则是,您应该更喜欢使用GIS的基础数据管理功能来存储信息。替代方案是一些临时的GIS将信息存储在其“项目文件”中或以其他某种独立方式存储的方法。一个典型的例子是手动选择和放置所需标签的做法。通常,这样做很容易快捷。无论何时需要更改或需要复制作品,都会出现问题。这些情况中的一种或另一种实际上是不可避免的。手动放置标签无异于以极其椭圆的方式在RDBMS外部存储信息(即应标记哪些特征子集)。即,仅通过显示哪些标签和不显示哪些标签来指定选择。考虑一下如何解决这些后续问题:

  • 客户希望相同的标签出现在相关但不同的地图中,该地图是不同项目的一部分。

  • 关于标签是否与某些其他属性相关联出现了一个问题。

  • 在一段时间后对标签进行多次更改后,系统要求您还原到原始版本。

在这些情况下,解决问题所涉及的工作可能是巨大的:您必须重新做一次标签重做,或者对数据库表进行手动交叉检查,或者查找并恢复旧的归档项目文件。如果标签改为由数据库中的布尔值字段表示,则该工作几乎是微不足道的。


1
我只是刚刚开始使用GIS,但从软件开发中获得了一些数据库知识。我怀疑我很快就会遇到有关保存原始数据集的后续问题,方法是创建一个单独的,特定于客户的表,该表与原始数据集一对一地连接在一起,并可能作为PostgreSQL视图提供以提高透明度。
Brian Kelly

是的,这也是一个很好的解决方案。利用数据库知识,您知道几乎没有一个完美的答案。总会有一些权衡。查找表在某些情况下是优雅且完美的。实际上,通常您只需要一个新表,该表列出了要标记的要素的ID:对图层属性表的连接会创建一个新的(外部)字段,对于不被标记的要素,该字段为null。好去。但是现在您有一个要在数据库中管理的新表:需要进行权衡。

8

您可能只需要在新的基于表达式的标签中设置规则即可。该规则将作为您为获得结果标签所做的工作的文档。

与“布尔标志”方法相比,优点在于,在处理正确的规则时,此方法更加灵活。无需更改基础数据集即可轻松更改和完善规则。另一方面,它不能移植到其他GIS软件包中。

这是一个示例,其中我仅标记名称超过六个字符且具有特定类的要素:

在此处输入图片说明


1
但是这种情况下的规则是“我认为这些功能很重要而其他功能不重要”。我认为没有功能:-)
Brian Kelly

1
此外,此问题与“何时更改数据集以及何时复制数据集?”有关。我怀疑那是更大的对话。
Brian Kelly

我只是假设那些重要功能至少具有一个可以使用的ID,就像我使用clazz属性一样。两种解决方案都有优点。
昏暗
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.