使用QGIS的带有控制点的地理配准矢量层?


29

我有一个非地理参考的矢量层,需要对其进行地理参考。使用栅格图层,该任务既简单又直接,但是我不知道该如何处理矢量图层。我有一些控制点具有已知的坐标,应该为转换提供一些基础。因此,假设我知道id-s为1、2和3的点应具有x1,y1的坐标;x2,y2; x3,y3。除了简单的移位之外,还可能会有一些旋转和比例转换。

有任何想法吗?


您是否尝试过qgsAffine插件?此处类似的问题: gis.stackexchange.com/questions/22691/how-to-georeference-a-dxf
Rayner

Affine插件可能会执行转换,但是您需要知道转换参数才能使用它。您可以发布三个点的矢量坐标和相应的真实坐标吗?N.
nhopton 2012年

您可以使用gdal_rasterize将shapefile转换为tiff,对tiff进行地理参考,然后从世界文件中提取参数吗?
klewis 2012年

Answers:


10

要对矢量图层进行地理配准,请尝试使用qgsAffine插件。

在菜单中的“哪里可以找到qgsaffine”中有更多信息


3
谢谢你的回答。我想我必须先使用qgsAffine并手动找出转换框架参数。我只是希望有某种方法可以使该过程自动化。也许我会尝试编写一些Python代码来做到这一点
AHaav 2012年

1
考虑一下,您可能会发现GRASS v.transform(在Sextante工具包中)比qgsAffine插件更友好地使用。N.
nhopton 2012年

1
从外观上看,v.transform也将为您完成总和,请参阅grass.osgeo.org/gdp/html_grass63/v.transform.html
nhopton 2012年

8

鉴于您具有某些控制点,您应该能够使用仿射变换来移动矢量数据。看一下这个食谱。该过程分为两部分:

  1. 使用控制点定义所需仿射函数的系数
  2. 取这些系数并将其应用于postgis中的ST_Affine()。

如果将控制点放入CSV文件(old_x,old_y,new_x,new_y),则可以从链接中剪切R粘贴命令来求解系数部分。


7

我推荐用于QGIS的Vector Bender插件。我试过了,它工作正常并且对用户友好。根据定义的点对数量,您可以执行以下操作:

  • 翻译:从一个起点到终点的翻译(1对)
  • 统一:平移,缩放和旋转(2对)
  • 弯曲:附加变形(3对或更多)

您可以在此处找到一个简短的视频,我建议您在安装插件后阅读Vector Bender帮助。


我同意,Vector bender插件直观且可以快速使用。但是,我无法镜像/翻转向量。对于此操作,我使用Affine转换插件(QGIS v2.18)。
jurajb


2

我只需要这样做,并最终做到了:

  1. 栅格化shapefile
  2. 使用Georeferencer插件对栅格进行地理配准
  3. 将GCP保存为gcps.points文件
  4. 使用此文件计算仿射变换
  5. 使用qgsAffine将仿射变换应用于shapefile

以下脚本使用保存的GCP计算仿射变换矩阵:

# Computes an affine transform based on QGis GCPs
# Usage: gcp_affine.py gcps.points

import csv
import sys
import numpy as np
from skimage.transform import AffineTransform

u = list(csv.DictReader(open(sys.argv[1], "rb")))
source = [(d["pixelX"], d["pixelY"]) for d in u]
dest = [(d["mapX"], d["mapY"]) for d in u]
source = [map(float, s) for s in source]
dest = [map(float, s) for s in dest]
source = np.array(source)
dest = np.array(dest)
aft = AffineTransform()
aft.estimate(source, dest)
np.set_printoptions(suppress=True)
print aft._matrix


2

根据我对Rayner的回答所作的评论,可以在Sextante工具箱中运行的GRASS v.transform可以用于计算变换参数,并将其应用于矢量层以执行仿射变换。需要包含控制点的文本文件,格式为此处所示。

它非常易于使用并且运行良好。


也许我正在变老,但只是想知道人们是否还记得Arcview 3.0中的ShapeWarp用户插件。它是如此易于使用。我总是发现这些其他工具(v.transform / affine)要麻烦得多。难道没有人试图在QGIS上重新创建ShapeWarp的便利性吗?
莎拉德

1

此处提供的几个答案不再是QGIS 3的选项,和/或仅允许对地理参考的矢量文件进行线性转换。这可能会回答OP的问题,但是看这篇文章的其他人可能希望其他转换选项可用于地理配准矢量文件。

地理配准矢量文件的某些解决方案存在问题:

  • qgsAffine插件仅允许线性转换。这意味着它可以缩放,旋转和移动矢量文件,但不能弯曲或扭曲矢量文件。栅格文件的地理配准器提供了更多选项,并允许进行多种转换,包括二阶多项式和薄板样条线。另外,在QGIS 3中似乎仍然没有提供qgsAffine插件。

  • GRASS模块v.transform与qgsAffine插件类似,仅允许线性转换。

  • Vector Bender插件似乎是一个不错的选择,但尚未完全移植到QGIS 3,因此目前不是一个选择。它看起来好像不再维护了。

如HeikkiVesanto的帖子中所建议的那样,使用ogr2​​ogr是一个不错的选择。它允许使用GCP(地面控制点),并指定所需的转换类型。我在任何地方都找不到有关如何执行此操作的说明,因此我在下面提供了一些说明:

  1. 生成一组GCP对,其中一个点是非参考矢量文件中的原始位置,另一点是地理参考工作空间中的所需位置。

  2. 有多种生成GCP的方法。我在QGIS中使用了Georeferencer GDAL插件。使用插件管理器安装后,可以在“栅格”下拉菜单下使用此功能。它仅适用于栅格文件,因此您必须首先将矢量文件转换为栅格文件。这可以通过“处理工具箱:GDAL:矢量转换:栅格化(矢量到栅格)”来实现。将分辨率设置为数字,仍然允许您查看矢量文件的功能。

  3. 地理定位器具有一个不错的界面,可让您添加许多GCP点。您还可以测试不同的转换,并查看哪个效果最佳。通过查看残差,您可以查看GCP点是否有可能出错。添加完所有GCP点并检查您喜欢的输出后,就可以从Georeferencer中导出GCP文件,以对原始矢量文件进行地理配准。

  4. GCP文件需要更改为以下格式。您可以根据需要添加任意数量的GCP点,每个点以-gcp开头,并以空格分隔。我用800多个GCP点运行了它,效果很好。

    -gcp <ungeoref_x1> <ungeoref_y1> <georef_x1> <georef_y1> -gcp <ungeoref_x2> <ungeoref_y2> <georef_x2> <georef_y2>
  1. 可以通过多种方式将GCP点更改为正确的格式。我将它们作为csv文件导入到Excel中,并创建了一个列以为每个点输出正确的格式。然后,将该列粘贴到TextEdit中,并将行尾替换为空格。

  2. 您要地理参考的矢量文件应使用与最终地理参考文件相同的SRS导入到工作空间中,该文件应该与工作空间相同。如果最初使用的是其他SRS,则距离实际位置可能还有很长的路要走,但是转换会将其移动到正确的位置。

  3. 通过“处理工具箱:GDAL:矢量转换:转换格式”访问ogr2ogr。这使您可以选择要地理参考的矢量文件以及输出文件。在“其他创建选项”字段中,添加一个命令,该命令指定所需的转换类型,然后添加包含所有GCP点的行。

  4. 用于不同转换类型的命令包括:

    • “ -order 1”代表线性
    • “阶数2”表示二阶多项式
    • 三阶多项式的“阶数3”
    • “ -tps”表示薄板样条线。
  5. 例如,添加到“其他创建选项”字段中的代码可能类似于:

-order 2 -gcp <ungeoref_x1> <ungeoref_y1> <georef_x1> <georef_y1> -gcp <ungeoref_x2> <ungeoref_y2> <georef_x2> <georef_y2>
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.