从头开始渲染非常大的图像,然后将其拆分为图块(适用于Google地图)

时间:2012-08-30 20:14:33

标签: image google-maps image-processing google-maps-api-3 gdi+

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

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

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

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

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

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

为了让它更容易理解,请考虑输入/输出。我的输入是我需要绘制的数据(线条,圆圈,文本等),它们分布在数万个像素上,输出必须是图块。我真的不在乎什么是魔术盒'是的,我甚至不关心平台是什么。

2 个答案:

答案 0 :(得分: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*]当绘制跨越多个图块的对象时,如果对象从当前图块开始,则其中的一部分将自动省略,因为您将尝试在图块外部绘制,而如果对象从上一个图块开始,你正在绘制第二个部分,然后像素数应该是负数,这意味着它开始于相邻图块。

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

答案 1 :(得分:1)

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