1

我有一大组谷歌地图 api v3 折线和标记,需要呈现为透明 PNG(实现为 ImageMapType)。我已经完成了关于从 latLng 到像素和平铺坐标的转换的所有数学/几何。

问题是:在我的应用程序允许的最大缩放比例下,即 18 倍,复合图像的宽度和高度至少跨越 80000 像素。因此,将其渲染成一块,然后将其拆分为图块变得不可能。

我尝试了预先分割多段线并将零件放入瓦片中的方法,然后单独渲染每个瓦片,直到现在几乎可以正常工作。但是当我需要绘制风格化的标记/文本和其他花哨的东西等时,它会变得非常困难。

到目前为止,我使用 C# GDI+ 作为绘图方法(ol' Bitmap / Graphics 对)。

这里的许多问题是关于拆分已经存在的图像、存储并将其链接到 API。我已经知道该怎么做。

我的问题是如何绘制初始非常大的图像然后将其拆分?它并不真的需要是一个真正的图像/位图/调用它任何你想要的解决方案。一位朋友建议我使用 SVG,但我不知道有什么好的渲染解决方案可以满足我的需求。

为了使它更容易理解,请从输入/输出的角度来考虑。我的输入是我需要绘制的跨越数万像素的数据(线条、圆圈、文本等),输出必须是图块。我真的不在乎“魔盒”是什么,我什至不在乎平台是什么。

4

2 回答 2

2

我在创建自定义图块时遇到了同样的问题,而您一次创建一个图块的解决方案是正确的。您只需要在流程中添加一些策略。我做的是这样的:

Pseudo code:
for each tile {
  - determine the lat/lon corners of the tile.
  - query the database and load the objects that are within this tile.
  for each object{
    - calculate the tile pixels on which the object should be painted. [*A*]
    - draw the object on the tile.
    - Save the tile. (you're done with this tile).
  }
}

或者:

    Pseudo code:
    - for each object to be drawn {
      - determine what tile the object should be painted on.
      - calculate the tile pixels on which the object should be painted.[*A*]
      - get that tile, if it doesn't yet exist create a new one.
      - draw the object on the tile.
      - Save the tile. (you might need to draw more on this tile later)
}

我用 Perl 和 GD 库来做这件事。

[*A*]当绘制跨越多个图块的对象时,如果对象从当前图块开始,那么它的一部分将自动被忽略,因为您将尝试在图块外部进行绘制,而如果对象从前一个图块开始并且您'正在绘制第二部分,那么像素数应该是负数,这意味着它从相邻的图块开始。

这在书面帖子中有点难以解释,因此如果您需要,请随时要求进一步澄清,我将编辑答案。

于 2012-08-31T05:47:52.173 回答
1

我建议了解 GDAL (http://gdal.org) 及其库。它具有用于光栅化、平铺、数据转换、投影、变形等的库。

于 2012-08-31T01:57:57.390 回答