我已经使用Dxf2Shp插件将矢量平面图(DXF)添加到QGIS中的空白项目中。
我一直在阅读教程和StackExchange线程,但似乎无法找到如何“地理参考”我的图层?
我假设我可以以某种方式选择建筑物的角落并设置纬度/经度。
我的目标是导出一个可以与TileMill和TileStache一起使用的shapefile 。
我意识到项目坐标实际上是经/纬度坐标:
并且我需要使用“仿射(旋转,平移,缩放)”插件来“放置”我的CAD工程图。
我已经使用Dxf2Shp插件将矢量平面图(DXF)添加到QGIS中的空白项目中。
我一直在阅读教程和StackExchange线程,但似乎无法找到如何“地理参考”我的图层?
我假设我可以以某种方式选择建筑物的角落并设置纬度/经度。
我的目标是导出一个可以与TileMill和TileStache一起使用的shapefile 。
我意识到项目坐标实际上是经/纬度坐标:
并且我需要使用“仿射(旋转,平移,缩放)”插件来“放置”我的CAD工程图。
Answers:
使用OpenJump计算仿射变换参数可得出:
Scale x: 0.02550720529745378
Scale y: 0.025669710194697357
Rotation: -88.6538203230914
Dx: 357101.9 (Translation x)
Dy: 4512814.6 (Translation y)
正确应用这些参数后,您的shapefile将从使用的本地CRS转换为WGS84 / UTM Zone 17 North(EPSG:32617)。然后,可以在QGIS中将转换后的数据导出(“另存为”)到任何所需的CRS。例如,Google Mercator或lat / lon。
坏消息是,我从未能够成功地将QGIS仿射插件用于包含旋转的转换。从某些方面来看,它对其他人有效,但对我不起作用,因此这一定是我做错了。如果有人能告诉我这是什么,我将不胜感激。
有一个线程在这里对affining载体是良好的值得一读。我在第一页的底部介绍了用于向量固定的方法。
如果您真的卡住了,可以发布一个指向shapefile的链接,我们都可以尝试将其转换。
事后思考。如果您决定尝试使用OpenJump方法,则需要纬度/经度点的WGS84 / UTM区域17北(EPSG:32617)坐标:
EPSG:32617: 361154.4 4513930.1
lat/long: 40.764622,-82.645056
shapefile coor: 947.3,1242.8
EPSG:32617: 361152.2 4513850.3
lat/long: 40.763903,-82.645064
shapefile coor: 4050.3,1035.7
EPSG:32617: 361246.5 4513886.7
lat/long: 40.764247,-82.643956
shapefile coor: 2710.5,4765.2
首先,您需要将地理坐标投影到笛卡尔2D坐标系上,因为仿射变换不适用于地理坐标系。
您可以从控制点或变换参数应用仿射变换。QGIS插件会询问您转换参数,但是对于用户来说,拥有控制点更为常见。
从控制点可以计算转换参数。对于仿射变换,有6个变换参数,因此您至少需要3个控制点(每个控制点包含4个坐标:Xsource,Ysource,Xtarget,Ytarget),但是建议更多控制点具有冗余性,因此可以应用最小二乘,可为您估计转换的质量。请记住,仿射变换可以旋转,移动,缩放(甚至在每个轴上应用不同的因子)和倾斜几何形状。
控制点必须采用以下形式:
X SOURCE: Xs
Y SOURCE: Ys
X TARGET: Xt
Y TARGET: Yt
参数为:
a: Scale X
e: Scale Y
d: Rotation X
b: Rotation Y
c: Translation X
f: Translation Y
我们知道:
Xt = X*a + Y*b + c
Yt = X*d + Y*e + f
因此,您需要解决此方程组(3个控制点):
¦ Xs1 Ys1 1 0 0 0 ¦ | a ¦ ¦ Xt1 ¦
¦ Xs2 Ys2 1 0 0 0 ¦ ¦ b ¦ ¦ Xt2 ¦
¦ Xs3 Ys3 1 0 0 0 ¦ ¦ c ¦ = ¦ Xt3 ¦
¦ 0 0 0 Xs1 Ys1 1 ¦ ¦ d ¦ ¦ Yt1 ¦
¦ 0 0 0 Xs2 Ys2 1 ¦ ¦ e ¦ ¦ Yt2 ¦
¦ 0 0 0 Xs3 Ys3 1 ¦ ¦ f ¦ ¦ Yt3 ¦
其中参数a,b,c,d,e和f未知。
一旦计算了参数a,b,c,d,e和f(例如,使用此在线方程求解器),就可以将它们放入QGIS插件界面,如下所示:
X' = a*x + b*y + c
Y' = d*x + e*y + f
要么:
我认为这解决了您的两个问题。