乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 102|回复: 6

GeoLocationData缩放因子返回错误的值

[复制链接]

9

主题

30

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
66
发表于 2015-9-26 08:22:10 | 显示全部楼层 |阅读模式
嗨,
我是一个民用3D用户,我正在尝试实现此代码以将本地坐标(x, y)转换为UTM网格坐标(北,东):
Dim gd As GeoLocationData=DB.GeoDataObject.GetObject(OpenMode.ForRead)
Dim As Matrix3d=Matrix3d.Displacement(gd.DesignPoint.GetVectorTo(gd.ReferencePoint))
m=m*Matrix3d.Rotation(gd.NorthDirection,gd.UpDirection,gd.DesignPoint)
m=m*Matrix3d.Scaling(gd.ScaleFactor,gd.DesignPoint)
Dim ptUTM as Point3d=ptLOCAL.TransformBy(m)
但是,gd.ScaleFactor始终返回1,即使gd.ScaleEstimationMethod=ScaleEstimationMethod.ScaleEstMethodReferencePoint
注意:民用3D返回正确的值:
Autodesk.Civil.ApplicationServices.CivilApplication.ActiveDocument.Settings.DrawingSettings.TransformationSettings.GridScaleFactor
怎么了?我错过了什么吗?

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

3

主题

9

帖子

1

银币

初来乍到

Rank: 1

铜币
21
发表于 2015-10-8 20:25:06 | 显示全部楼层
所以我对你用的autoCAD的味道一无所知。我所知道的是地理信息学。首先想到的是:你是否使用了足够的进动。特定投影的比例因子通常非常接近于1,0.997是我本地情况的起点。第二:你不能用一个点来缩放和旋转,你需要向量。就像我说的不确定“Matrix3d。旋转"和" Matrix3d。缩放“工作,但他们必须需要矢量而不是点?
回复

使用道具 举报

9

主题

30

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
66
发表于 2015-10-28 14:37:59 | 显示全部楼层
您好,
计算UTM坐标所需的精度等于传统程序中出现的精度。实际上,我正在编写一个程序,该程序创建包裹的描述性纪念馆,以及谁将在AutoCAD中工作。在许多情况下,用户希望纪念馆出现在批次顶点的坐标所在的位置,但设计通常是在局部坐标中。然后程序必须具有转换能力,但应该为描述显示正确的结果。
参见此程序:http://tbn2net.appspot.com/download?pacid=C3DMEMO&lang=en
回复

使用道具 举报

1

主题

11

帖子

3

银币

初来乍到

Rank: 1

铜币
15
发表于 2015-10-31 19:23:52 | 显示全部楼层
嗨,
你说的“局部坐标”是什么意思,局部坐标系统可以是任何东西,x,y(单位?)没有地理意义上的全球参考就没有任何意义。
至于转换,假设您在Civil 3D(一种包含Map的产品)中,您可以使用查询从一个系统转换到另一个系统,前提是您有一个定义良好的本地系统。转换到UTM的程序*必须*知道(或者能够从本地系统定义中推断出)至少UTM区号。加斯顿·努内斯
回复

使用道具 举报

9

主题

30

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
66
发表于 2015-11-4 09:10:59 | 显示全部楼层
局部坐标被仲裁。为了计算一个属性的面积,我们使用局部坐标,因为没有失真。地理参考以UTM坐标或甚至地理坐标给出。但是该地产的面积不能用UTM坐标来确定,因为存在失真,所以您需要转换
通常,它会转换为地心系统,获取顶点的地心坐标,然后计算面积。
geolocation data类将地理坐标转换为本地坐标(autocad wcs ),反之亦然,但不会转换为UTM坐标
为此,我实现了一个代码:
  1.     Function TransformToUTM(gd As GeoLocationData, ByVal local As Point3d) As Point3d
  2.         Dim geo As Point3d = gd.TransformToLonLatAlt(local)
  3.         Dim latd = geo.Y
  4.         Dim lngd = geo.X
  5.         Dim drad = Math.PI / 180.0
  6.         Dim xDoc As New XmlDocument
  7.         xDoc.LoadXml(gd.CoordinateSystem)
  8.         Dim SemiMajorAxis As Double = CDbl(xDoc.GetElementsByTagName("SemiMajorAxis").Item(0).InnerText)
  9.         Dim b As Double = CDbl(xDoc.GetElementsByTagName("SemiMinorAxis").Item(0).InnerText)
  10.         Dim k0 = 0.9996
  11.         Dim e = Math.Sqrt(1 - (b / SemiMajorAxis) * (b / SemiMajorAxis))
  12.         Dim phi = latd * drad
  13.         Dim lng = lngd * drad
  14.         Dim utmz = 1 + Math.Floor((lngd + 180) / 6)
  15.         Dim zcm = 3 + 6 * (utmz - 1) - 180
  16.         Dim e0 = e / Math.Sqrt(1 - e * e) 'Called e prime In reference
  17.         Dim esq = (1 - (b / SemiMajorAxis) * (b / SemiMajorAxis)) ' e squared For use In expansions
  18.         Dim e0sq = e * e / (1 - e * e) ' e0 squared - always even powers
  19.         Dim N = SemiMajorAxis / Math.Sqrt(1 - Math.Pow(e * Math.Sin(phi), 2))
  20.         Dim T = Math.Pow(Math.Tan(phi), 2)
  21.         Dim C = e0sq * Math.Pow(Math.Cos(phi), 2)
  22.         Dim A = (lngd - zcm) * drad * Math.Cos(phi)
  23.         Dim M0 = 0
  24.         Dim M = phi * (1 - esq * (1 / 4 + esq * (3 / 64 + 5 * esq / 256)))
  25.         M = M - Math.Sin(2 * phi) * (esq * (3 / 8 + esq * (3 / 32 + 45 * esq / 1024)))
  26.         M = M + Math.Sin(4 * phi) * (esq * esq * (15 / 256 + esq * 45 / 1024))
  27.         M = M - Math.Sin(6 * phi) * (esq * esq * esq * (35 / 3072))
  28.         M = M * SemiMajorAxis 'Arc length along standard meridian
  29.         Dim x = k0 * N * A * (1 + A * A * ((1 - T + C) / 6 + A * A * (5 - 18 * T + T * T + 72 * C - 58 * e0sq) / 120)) 'Easting relative To CM
  30.         x = x + 500000 'Easting standard
  31.         Dim y = k0 * (M - M0 + N * Math.Tan(phi) * (A * A * (1 / 2 + A * A * ((5 - T + 9 * C + 4 * C * C) / 24 + A * A * (61 - 58 * T + T * T + 600 * C - 330 * e0sq) / 720)))) 'Northing from equator
  32.         If (y < 0) Then y = 10000000 + y
  33.         Return New Point3d(x, y, local.Z)
  34.     End Function

回复

使用道具 举报

9

主题

30

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
66
发表于 2015-11-4 09:17:58 | 显示全部楼层
该函数接收一个3dpoint作为局部坐标(autocad wcs)并转换为UTM
回复

使用道具 举报

3

主题

9

帖子

1

银币

初来乍到

Rank: 1

铜币
21
发表于 2015-12-8 20:27:15 | 显示全部楼层
这是一次有趣的讨论
当我听到“局部网格坐标”时,我首先想到的是基于任意原点的规划网格,类似于10002000100,选择了北向以简化设计(在建筑广场的前面)。可能来自真实世界的测量。然后,这将为网格移动到新网格生成向量。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-4 22:03 , Processed in 0.272439 second(s), 66 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表