我有一大堆谷歌地图api v3折线和标记,需要渲染为透明的PNG(实现为ImageMapType)。我已经完成了关于从latLng到像素和平铺坐标的转换的所有数学/几何。
问题是:在我的应用程序的最大允许缩放比例为18时,复合图像的宽度和高度将至少跨越80000像素。因此,将其分成一块,然后将其拆分成瓷砖变得不可能。
我尝试了预先拆分折线并将零件放入瓷砖的方法,然后将每个瓷砖单独渲染,直到现在几乎都可以正常工作。但是当我需要绘制风格化的标记/文本和其他花哨的东西等时,它将变得非常困难。
到目前为止,我使用C#GDI +作为绘图方法(ol' Bitmap / Graphics对)。
这里的许多问题都是关于拆分现有图像,存储并将其链接到API。我已经知道该怎么做了。
我的问题是如何绘制初始非常大的图像然后将其拆分?它并不需要真正的图像/位图/无论你想要什么解决方案都可以调用它。一位朋友建议我使用SVG,但我不知道任何好的渲染解决方案,以满足我的需求。
为了让它更容易理解,请考虑输入/输出。我的输入是我需要绘制的数据(线条,圆圈,文本等),它们分布在数万个像素上,输出必须是图块。我真的不在乎什么是魔术盒'是的,我甚至不关心平台是什么。
答案 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)及其库。它有用于光栅化,平铺,数据转换,投影,变形等的库。