【问题标题】:How georeference image on Delphi?Delphi上如何地理参考图像?
【发布时间】:2012-10-08 16:08:29
【问题描述】:

我有一个位图,我的用户在图像上设置了 2 个或更多标记,然后为任何标记设置纬度和经度。 有了这些信息,我必须为 KML 文件创建一个地面叠加层,所以我需要知道如何计算 LatLonBox 参数:位图的北、南、东、西和旋转。

有什么想法吗?

这是一个结果示例:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
  <Folder>
    <name>Ground Overlays</name>
    <description>Examples of ground overlays</description>
    <GroundOverlay>
      <name>Large-scale overlay on terrain</name>
      <description>Overlay shows Mount Etna erupting on July 13th, 2001.</description>
      <Icon>
        <href>http://developers.google.com/kml/documentation/images/etna.jpg</href>
      </Icon>
      <LatLonBox>
        <north>37.91904192681665</north>
        <south>37.46543388598137</south>
        <east>15.35832653742206</east>
        <west>14.60128369746704</west>
        <rotation>-0.1556640799496235</rotation>
      </LatLonBox>
     </GroundOverlay>
  </Folder>
</kml>

我的问题是北、南、东、西和旋转值。 事实上,我的用户必须加载图像,然后他在其上放置 2 个或更多标记,并为所有标记设置纬度和经度。有了这些数据,我认为有可能获得北、南、东、西和旋转值,但我不知道如何。 如果用户只放置 2 个标记很容易,我可以计算 dX 和 dY,然后是北、南、东和西(在这种情况下,我设置旋转 = 0),但如果用户设置超过 2 个点?

【问题讨论】:

  • 如果你能展示你尝试过的东西会很好。这个问题感觉只写了一半。我觉得不赞成投票,所以我避免这样做,但这个问题可能需要更多的努力。
  • 您能补充更多信息吗?目前尚不清楚您现在拥有什么以及您需要什么。如果你能更好地描述这些,我们可以更好地帮助你。

标签: delphi bitmap kml


【解决方案1】:

这对于评论来说太长了,所以我将其写为答案(我确实尝试将其写为评论两次!)。首先让我们来处理您将在地图上获得的标记数量:在完美的世界中,您只需要两个标记,因为从几何上讲,它们就是您随后推导 any 坐标所需的全部地图上的其他点。这意味着第三个标记应该是冗余,它的精确坐标可以使用前两个点的坐标来计算。您暗示使用第三点可以提取“旋转”,但这是完全错误的,因为地图是 2D 的!这是一个使用两个点完美定义的旋转矩形的示例:

用户在地图上标记的内容:

如何解释该信息:

当您从同一个矩形中获得第三个点时,您就有机会进行一些“纠错”。假设您要提取矩形左上角的精确坐标。为了计算它,你只需要两点数学。当您得到 3 个点(我们称这些点为 A、B 和 C)时,您可以使用 3 个等式计算相同的坐标:

(A,B) => P1
(A,C) => P2
(B,C) => P3

...您几乎可以保证为左上角的坐标获得 3 个不同的值(P1、P2 和 P3)!您现在需要应用一些纠错数学,以便将 3 个不同的值“合并”为一个值。这种纠错通常在现实世界中用于测地线(那些拿着黄色三脚架的人做测地线图,你会在所有建筑工地上看到他们)。如果您想要正确的解决方案,您可以研究一下,或者您可以简单地平均 3 个值并完成它,它很可能足以满足您的需求。

请求的输出 XML 似乎使用 TOP、BOTTOM、LEFT、RIGHT 和 ROTATION 坐标定义图像矩形。为了将您的坐标转换为该格式,您需要弄清楚目标软件对 XML 的作用。如果我猜测它会是这样的:图像首先放置在地图上由上/下/左/右坐标定义的空间中,然后旋转给定的数量。如果这是真的,我会这样做来准备你的位图:

  1. 首先确定左上角、右上角和右下角的坐标。到目前为止,应该清楚两点就足够了,但如果你得到多于两点,请找出一个纠错方案并使用所有点来获得更高的精度。
  2. 使用左上角和右上角坐标计算当前旋转。
  3. 找出目标软件使用的旋转中心点的坐标。目标软件是否围绕其中心旋转图像?它是否围绕左上角旋转图像?无论如何,计算该点的坐标。
  4. 使用您在 (2) 处获得的旋转角度围绕您在 (3) 处计算的 CENTER 旋转您的坐标,以使您的图像与水平轴平行。
  5. 从旋转的左上角向北和向西行驶,从右下角向南和向东行驶。您在 (2) 处获得了旋转角度,所以现在您已经获得了完整的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-29
    • 2019-03-25
    • 2017-04-30
    • 1970-01-01
    • 2013-05-11
    • 2021-08-15
    相关资源
    最近更新 更多