在QGIS
中移动点时更改点的样式我在QGIS中有1000个点。我想一个接一个地移动它们,并且我想知道我已经移动了哪些点。我想更改我之前移动的点的样式。我该怎么做?
解答动态
在移动点之前,使用$x和$y函数(称为“original
x”和“original
y”
)为x和y坐标创建一个字段,然后在图层符号中创建一个基于规则的符号,并使用此符号添加一个特征规则:
(";原件x";
";原件
ylt;>;$x
$y)
然后还添加第二个特征,将规则设置为Else(这适用于尚未移动的特征)。
一种可能性:使用$x和$y将当前坐标硬编码到属性表中作为整数字段。然后将点填充颜色的数据定义覆盖设置为if((round($x)not LIKE";带有旧x坐标的列或圆形($y)与带有旧y坐标的列不同(“,”绿色“,”红色“)
如果点已经移动,它将是绿色的,如果没有移动,它将是红色的。
您可以创建两个新属性:初始坐标(正常字段)和当前坐标(虚拟字段)。然后设置基于规则的样式,比较两个坐标是否相等的规则。
在执行移动之前,使用字段计算器为坐标创建一个新的属性字段,使用表达式$x/$y表示x和y坐标。您可能只使用其中一个坐标:手动移动点时,几乎不可能保持两个坐标之一的原始值。但是你也可以对两个坐标都这样做,或者把x和y坐标连在一个字段中。在下面的内容中,我仅使用x坐标进行演示。然后再次创建一个新字段,但这次一定要创建一个虚拟字段—一个动态更新的字段。再次使用$x生成相应坐标的值。
现在,将图层的样式设置为rule base,并为点创建两个规则:“initial\u xquot;current\u xlt;>切换=并指定不同的样式(如不同的颜色)。
现在移动点时,它们将自动更改样式,而未移动的点将保留初始样式。
屏幕截图:基于规则的样式,带有白点(未移动)和移动点的红点。
可能有更直接的方法,但这是可行的。
在示例中,在向量层(ts和ts2)中创建2个日期时间字段。更新值,使每个字段包含相同的时间戳(使用now()函数):
更新ts列,使其具有与ts2相同的精确值字段:中的
属性窗体,将ts的默认值设置为now(),并选中“更新时应用默认值”。这意味着,当您添加新点或更新现有点时,ts列将用now()current datetime更新。
对ts2执行相同操作,但只需减去一秒钟。添加点时,ts2始终比ts小1秒:
添加基于规则的样式,第一个规则比较ts和ts2:当ts大于ts2时,应用自定义样式。再加上一点规则:现在就这样如果更新现有点或添加新点,则ts始终大于ts2,并且规则将正确运行。
希望这有助于
基于与存储的原始位置的比较建立其他答案,您可以让QGIS为您做更多的工作你:
In层属性/字段使用字段计算器(算盘图标)创建一个新字段,称为OrigLocation,键入文本,表达式为geom\u to \u wkt($geometry)。这将当前位置编码为包含x和y的字符串。单击“应用”或“确定”保存此新字段。
再次转到图层属性/字段并使用字段计算器创建新字段?,但这次选中“创建虚拟字段”后,键入integer,表达式geom\u to \u wkt($geometry)=quot;。这会将当前几何图形与保存的原始几何图形进行比较,相等时会显示1,不相等时会显示0,并始终保持最新。相反,在上一步中,我们没有将其设置为虚拟场,因此几何体保存在其当时的当前状态。
现在可以使用分类渲染器根据是否移动来定义不同的点?为0或1。或者,如果您愿意,可以保留原始符号并使用基于“Moved”的数据驱动重写;。示例:可以使用if(quot;,'#ff0000','#00ff00')使颜色移动时变为红色,移动时变为绿色。或者,添加另一个符号层(例如,围绕点的另一个圆或绘图效果)作为数据驱动的覆盖。
Meta-comment:其他答案已经建议使用与保存的初始位置的比较。这里调整的是只使用一个字段,而不是分别使用x和y;将比较逻辑放在虚拟字段定义中,而不是放在渲染规则中;然后对符号的特定元素使用分类的渲染器和/或数据驱动的覆盖,而不是基于规则的渲染器。- End
免责声明:
本页内容仅代表作者本人意见,若因此产生任何纠纷由作者本人负责,概与琴岛网公司无关。本页内容仅供参考,请您根据自身实际情况谨慎操作。尤其涉及您或第三方利益等事项,请咨询专业人士处理。