0

私はOpenStreetMapの比較的初心者ですが、特定の緯度と経度の画像タイルから地図のサムネイルを生成した経験がある人はいないでしょうか。lat. 33.8683例として、オーストラリアのシドニーはとで見つけることができますlong. 151.2086。特定のズームレベルでこれらの座標の画像タイルから128x128pngを生成できるようにしたいと思います。

私はArcGIS以前に使用したことがあり、そのようなタスク専用のサービスがあります。私はかなりグーグルで検索しましたが、まだ何も見つかりませんでしたOpenStreetMap

私はJavaを使用しているので、おそらくWebサービスなどの機能をデプロイしたいと思うでしょう。

ありがとう。

編集: switch2osm.orgの手順を使用して構築した独自のタイルサーバーを実行していることを追加する必要があります。

4

1 に答える 1

2

OpenStreetMapタイルがどのように保管されているかを発見した後、これを理解しました。基本は次のとおりです。

  • タイルは256×256ピクセルのPNGファイルです
  • 各ズームレベルはディレクトリであり、各列はサブディレクトリであり、その列の各タイルはファイルです。
  • ファイルにアクセスするには、http://localhost/osm/${z}/${x}/${y}.png
  • ${z} ${x} and ${y}緯度と経度に基づいて値を計算します。

OpenStreetMap Wikiには、タイル名を計算するためのさまざまな言語のコードブロックなど、このテーマに関する優れたドキュメントがいくつかあります。Javaソリューションが必要だったので、最終的に使用したコードは次のとおりです。

public class Mapper
{
    public static void main(String[] args)
    {
        int zoom = 11;
        double lat = -33.77651d;
        double lon = 150.94712d;
        System.out.println("http://localhost/osm/"
            + getTileNumber(lat, lon, zoom) + ".png");
    }

    public static String getTileNumber(double lat, double lon, int zoom)
    {
        int xtile = (int)Math.floor((lon + 180) / 360 * (1<<zoom));
        int ytile = (int)Math.floor((1 - Math.log(Math.tan(Math.toRadians(lat))
            + 1 / Math.cos(Math.toRadians(lat))) / Math.PI) / 2 * (1<<zoom));
        return ("" + zoom + "/" + xtile + "/" + ytile);
    }
}

これにより、必要な画像タイルのURLが返されます。例:http://localhost/osm/11/1882/1228.png画像の取得に使用できます。次に、Thumbnailatorを使用して128x128のサムネイルサイズを生成しました。

Thumbnails.of(new File("tile.png"))
  .size(128, 128)
  .toFile(new File("thumbnail.png"));

幸せな日々。

于 2013-03-22T22:20:23.200 に答える