我有一个非地理参考的矢量层,需要对其进行地理参考。使用栅格图层,该任务既简单又直接,但是我不知道该如何处理矢量图层。我有一些控制点具有已知的坐标,应该为转换提供一些基础。因此,假设我知道id-s为1、2和3的点应具有x1,y1的坐标;x2,y2; x3,y3。除了简单的移位之外,还可能会有一些旋转和比例转换。
有任何想法吗?
我有一个非地理参考的矢量层,需要对其进行地理参考。使用栅格图层,该任务既简单又直接,但是我不知道该如何处理矢量图层。我有一些控制点具有已知的坐标,应该为转换提供一些基础。因此,假设我知道id-s为1、2和3的点应具有x1,y1的坐标;x2,y2; x3,y3。除了简单的移位之外,还可能会有一些旋转和比例转换。
有任何想法吗?
Answers:
要对矢量图层进行地理配准,请尝试使用qgsAffine插件。
随着GDAL 1.10的发布,这已经成为可能。
通过在ogr2ogr中执行基本转换并在-gcp标记中提供控制点来完成此操作。http://www.gdal.org/ogr2ogr.html
有关指南,请参见:http : //gisforthought.com/georeferencing-vector-data-using-qgis-and-ogr2ogr/
我只需要这样做,并最终做到了:
gcps.points
文件以下脚本使用保存的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
请参阅我的答案,将两个多边形捕捉在一起,并尝试免费的openjump。
我认为它的仿射变换比qgis仿射插件更加用户友好。
此处提供的几个答案不再是QGIS 3的选项,和/或仅允许对地理参考的矢量文件进行线性转换。这可能会回答OP的问题,但是看这篇文章的其他人可能希望其他转换选项可用于地理配准矢量文件。
地理配准矢量文件的某些解决方案存在问题:
qgsAffine插件仅允许线性转换。这意味着它可以缩放,旋转和移动矢量文件,但不能弯曲或扭曲矢量文件。栅格文件的地理配准器提供了更多选项,并允许进行多种转换,包括二阶多项式和薄板样条线。另外,在QGIS 3中似乎仍然没有提供qgsAffine插件。
GRASS模块v.transform与qgsAffine插件类似,仅允许线性转换。
Vector Bender插件似乎是一个不错的选择,但尚未完全移植到QGIS 3,因此目前不是一个选择。它看起来好像不再维护了。
如HeikkiVesanto的帖子中所建议的那样,使用ogr2ogr是一个不错的选择。它允许使用GCP(地面控制点),并指定所需的转换类型。我在任何地方都找不到有关如何执行此操作的说明,因此我在下面提供了一些说明:
生成一组GCP对,其中一个点是非参考矢量文件中的原始位置,另一点是地理参考工作空间中的所需位置。
有多种生成GCP的方法。我在QGIS中使用了Georeferencer GDAL插件。使用插件管理器安装后,可以在“栅格”下拉菜单下使用此功能。它仅适用于栅格文件,因此您必须首先将矢量文件转换为栅格文件。这可以通过“处理工具箱:GDAL:矢量转换:栅格化(矢量到栅格)”来实现。将分辨率设置为数字,仍然允许您查看矢量文件的功能。
地理定位器具有一个不错的界面,可让您添加许多GCP点。您还可以测试不同的转换,并查看哪个效果最佳。通过查看残差,您可以查看GCP点是否有可能出错。添加完所有GCP点并检查您喜欢的输出后,就可以从Georeferencer中导出GCP文件,以对原始矢量文件进行地理配准。
GCP文件需要更改为以下格式。您可以根据需要添加任意数量的GCP点,每个点以-gcp开头,并以空格分隔。我用800多个GCP点运行了它,效果很好。
-gcp <ungeoref_x1> <ungeoref_y1> <georef_x1> <georef_y1> -gcp <ungeoref_x2> <ungeoref_y2> <georef_x2> <georef_y2>
可以通过多种方式将GCP点更改为正确的格式。我将它们作为csv文件导入到Excel中,并创建了一个列以为每个点输出正确的格式。然后,将该列粘贴到TextEdit中,并将行尾替换为空格。
您要地理参考的矢量文件应使用与最终地理参考文件相同的SRS导入到工作空间中,该文件应该与工作空间相同。如果最初使用的是其他SRS,则距离实际位置可能还有很长的路要走,但是转换会将其移动到正确的位置。
通过“处理工具箱:GDAL:矢量转换:转换格式”访问ogr2ogr。这使您可以选择要地理参考的矢量文件以及输出文件。在“其他创建选项”字段中,添加一个命令,该命令指定所需的转换类型,然后添加包含所有GCP点的行。
用于不同转换类型的命令包括:
例如,添加到“其他创建选项”字段中的代码可能类似于:
-order 2 -gcp <ungeoref_x1> <ungeoref_y1> <georef_x1> <georef_y1> -gcp <ungeoref_x2> <ungeoref_y2> <georef_x2> <georef_y2>