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

有什么想法吗?

评论

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

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

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

#1 楼

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

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

评论


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

–AHaav
2012年9月11日上午11:46

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

–尼普顿
2012年9月11日在12:03

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

–尼普顿
2012年9月11日12:28在

#2 楼

我建议为QGIS使用Vector Bender插件。
我尝试了一下,它工作正常且易于使用。
根据定义的点对数量,您可以执行以下操作:


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

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

评论


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

– jurajb
18年1月19日在22:19



#3 楼

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


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

如果将控制点放入CSV文件(old_x,old_y,new_x,new_y),则只需从链接中剪切R命令即可解决系数部分。

#4 楼

GDAL 1.10发行版现在可以实现。

通过在ogr2ogr中执行基本转换并在-gcp标记中提供控制点来完成。 http://www.gdal.org/ogr2ogr.html

有关指南,请参见:
http://gisforthought.com/georeferencing-vector-data-using-qgis-and -ogr2ogr /

#5 楼

我只需要这样做,并最终完成了此操作:


使用Georeferencer插件栅格化shapefile
对栅格进行地理配准
将GCP保存为gcps.points文件
使用此文件计算仿射变换
使用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


#6 楼

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

有关地理配准矢量文件的一些解决方案的问题:


qgsAffine插件仅允许线性转换。这
意味着它可以缩放,旋转和移动矢量文件,但不能
弯曲或扭曲矢量文件。栅格文件的地理配准器
提供了更多选项,并允许进行多种转换,包括二阶多项式和薄板样条线。另外,
似乎在QGIS 3中qgsAffine插件仍然不可用。
GRASS模块v.transform与qgsAffine插件类似,并且
仅允许线性转换。 br /> Vector Bender插件似乎是一个不错的选择,但它尚未完全移植到QGIS 3,因此目前不是一个选择。它似乎不再需要维护。

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


生成一组GCP对,其中一个点是原始的
位置在非参考矢量文件中,另一点是在地理参考工作空间中的所需位置。
有多种生成GCP的方法。我在QGIS中使用了
Georeferencer GDAL插件。使用插件管理器安装后,可以在
栅格下拉菜单中使用它。
它仅适用于栅格文件,因此必须首先转换向量
文件到栅格文件。这可以通过“处理工具箱:
GDAL:矢量转换:栅格化(矢量到栅格)”来实现。将
分辨率设置为数字,仍然可以查看
矢量文件的功能。
Georeferencer具有一个不错的界面,可让您添加许多
GCP点。您还可以测试不同的转换,并查看效果最好的
。通过查看残差,您可以查看您的GCP点是否有可能
出错。
添加所有GCP点,并检查是否喜欢输出后,即可
从地理配准器导出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导入到工作空间中。您需要最终的
地理参考文件,该文件应该与您的工作空间相同。
如果最初使用其他SRS,可能距离应该有很长的路要走,但转换后会将其移动到正确的位置。通过以下方式访问ogr2ogr “处理工具箱:GDAL:矢量转换:
转换格式”。这样,您可以选择要
进行地理参考的矢量文件以及输出文件。在“其他创建
选项”字段中,添加一个命令,指定您要使用的转换类型
需要,然后是包含所有GCP点的直线。

用于不同变换类型的命令包括:​​


“ -order 1”用于线性
“ -order 2”用于二阶多项式
“ -order 3”用于三阶多项式
“ -tps”用于薄板样条线。


例如添加到“其他创建选项”字段中的代码可能类似于:

-order 2 -gcp <ungeoref_x1> <ungeoref_y1> <georef_x1> <georef_y1> -gcp <ungeoref_x2> <ungeoref_y2> <georef_x2> <georef_y2>


#7 楼

请参阅我将两个多边形捕捉在一起的答案,并尝试免费的openjump。

我认为其仿射变换比qgis仿射插件更易于使用。

#8 楼

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

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

评论


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

–Sharad
19 Mar 19 '19在6:25