如何在Delphi上使用地理配准图像?

时间:2012-10-06 13:21:44

标签: delphi bitmap kml

我有一个位图,我的用户在图像上设置了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然后是北,南,东和西(在这种情况下我设置rotation = 0),但是如果用户设置多于2个点?

1 个答案:

答案 0 :(得分:2)

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

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

enter image description here

如何解释该信息: enter image description here

当您从同一个矩形中获得第3个点时,您将有机会进行一些“纠错”。假设您要提取矩形左上角的精确坐标。数学上只需要两点来计算它。当你获得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. 计算出目标SOFTWARE使用的旋转中心点的坐标。目标软件是否围绕它的中心旋转图像?它是否围绕左上角旋转图像?无论如何,计算该点的坐标。
  4. 使用(2)中的旋转角度围绕您在(3)处计算的CENTER旋转坐标,以使图像与水平轴平行。
  5. 从旋转的左上角取下NORTH和WEST,从右下角取下SOUTH和EAST。你的旋转角度为(2),所以现在你已经有了一个完整的解决方案。