1

透明なPNG(ImageMapTypeとして実装)としてレンダリングする必要があるGoogleマップAPIv3ポリラインとマーカーの大規模なセットがあります。latLngからピクセルおよびタイル座標への変換に関するすべての数学/ジオメトリを実行しました。

問題は、私のアプリの最大許容ズーム、つまり18で、複合画像の幅と高さの両方が少なくとも80000ピクセルに及ぶことです。そのため、1つのピースにレンダリングしてから、タイルに分割することは不可能になります。

事前にポリラインを分割してパーツをタイルに配置し、各タイルだけをレンダリングする方法を試しましたが、これまではほとんど問題なく機能していました。でも、定型化されたマーカーやテキストなどの派手なものを描く必要があると、とても難しくなります。

これまでのところ、描画方法としてC#GDI +を使用していました(古いビットマップ/グラフィックスのペア)。

ここでの多くの質問は、既存の画像の分割、保存、およびAPIへのリンクに関するものです。私はすでにそれを行う方法を知っています。

私の問題は、最初の非常に大きな画像を描画してから分割するにはどうすればよいですか?本当の画像/ビットマップである必要はありません/あなたが望む解決策と呼んでください。友人からSVGの使用を勧められましたが、自分のニーズに合った適切なレンダリングソリューションがわかりません。

少しわかりやすくするために、入出力の観点から考えてみてください。私の入力は、何万ものピクセルにまたがる描画する必要のあるデータ(線、円、テキストなど)であり、出力はタイルである必要があります。私は「魔法の箱」が何であるかを本当に気にしません、そして私はプラットフォームが何であるかさえ気にしません。

4

2 に答える 2

2

カスタムタイルを作成するときに同じ問題が発生しました。あなたは、一度に1つのタイルを作成するというソリューションで正しい方向に進んでいます。プロセスにいくつかの戦略を追加する必要があります。私がしていることはこのようなものです:

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*]複数のタイルにまたがるオブジェクトをペイントする場合、オブジェクトが現在のタイルで始まると、タイルの外側でペイントしようとするため、オブジェクトの一部が自動的に除外されます。一方、オブジェクトが前のタイルで始まり、 '2番目の部分を描画すると、ピクセル番号は負になります。これは、隣接するタイルから始まったことを意味します。

これを書面で説明するのは少し難しいので、必要に応じてさらに詳しい説明を求めてください。回答を編集します。

于 2012-08-31T05:47:52.173 に答える
1

GDAL(http://gdal.org)とそのライブラリについて知ることをお勧めします。ラスタライズ、タイリング、データ変換、プロジェクション、ワーピングなどのライブラリがあります。

于 2012-08-31T01:57:57.390 に答える