ベルリンが東京だったら

ベルリンとその周辺都市の位置関係を、東京とその周辺に移植してみます。
中心位置と周辺との位置関係は、「方位角と距離」に直してから目的位置に移植します。緯度経度のままでは距離的に正確な移植にならず、地理的に離れた両方の位置で正確な投影法はふつう存在しないためです。

ベルリンとその周辺の位置関係を、方位角と距離に変換

ベルリンとその周辺の都市の位置は、NGA GEOnet Names Server (GNS)から提供されているドイツの地名のタブ切りファイル*1から取得しました。緯度・経度から方位角・距離への変換には、geotools.rb を使います。

require 'geotools'

# NGA GNS から供給されるファイルを扱うクラス
class GNS
  def GNS.foreach(path)
    File.foreach(path) do |l|
      r = l.split(/\t/)
      f = {:nt => r[18], :pc => r[11], :lng => r[4].to_f, :lat => r[3].to_f,
        :name => r[23], :name_nd => r[24]}
      yield f
    end
  end
end

# ベルリンの座標を取得して始点に設定
gc = Geo::Tools::GeodeticCalculator.new
GNS.foreach('gm.txt') do |r|
  next unless r[:pc] == '1'
  next unless r[:name] == 'Berlin'
  gc.setStartingGeographicPoint(r[:lng], r[:lat])
end

# 主要都市の座標を取得して、ベルリンからの距離と方位角を書き出す
File.open('berlin_centered.txt', 'w') do |w|
  GNS.foreach('gm.txt') do |r|
    next unless r[:nt] == 'N'
    next unless r[:pc] == '1' or r[:pc] == '2'
    gc.setDestinationGeographicPoint(r[:lng], r[:lat])
    w.print "#{r[:name]}\t#{gc.getOrthodromicDistance}\t#{gc.getAzimuth}\n"
  end
end

東京からの位置に変換

上記のスクリプトで作成した berlin_centered.txt の内容を、東京からの位置に変換して、ついでに適当なランベルト図法に直して保存します。
また、地球地図の bnda.shp を同じランベルト図法に直して保存します。

require 'geotools'

class Tokyonizer
  def initialize
    # 日本経緯度原点の座標を東京の座標とみなす
    @pt_tokyo = Geo::import_wkt_geometry("POINT (#{139 + 44.0 / 60 + 28.8759 / 3600} #{35 + 39.0 / 60 + 29.1572 / 3600})")
    # 測地計算機。始点を東京にセット
    @gc = Geo::Tools::GeodeticCalculator.new
    @gc.setStartingGeographicPoint(@pt_tokyo.getX, @pt_tokyo.getY)
    # 表示用 Lambert Conformal Conic Projection
    wgs84 = Geo::import_epsg_crs(4326)
    lambert = Geo::import_wkt_crs(<<-EOS
PROJCS["_Lambert_Conformal_Conic",
    GEOGCS["GCS_WGS_1984",
        DATUM["WGS_1984",
            SPHEROID["WGS_1984",6378137,298.257223563]],
        PRIMEM["Greenwich",0],
        UNIT["Degree",0.017453292519943295]],
    PROJECTION["Lambert_Conformal_Conic_2SP"],
    PARAMETER["False_Easting",0],
    PARAMETER["False_Northing",0],
    PARAMETER["Central_Meridian",137.5],
    PARAMETER["Standard_Parallel_1",32],
    PARAMETER["Standard_Parallel_2",67],
    PARAMETER["Latitude_Of_Origin",0],
    UNIT["Meter",1]]
EOS
)
    @tr = Geo::Transform.new(wgs84, lambert)
  end

  def run
    Geo::FeatureList.open('tokyonized_berlin.shp') do |w|
      File.foreach('berlin_centered.txt') do |l|
        r = l.split(/\t/)
        name = r[0]
        distance = r[1].to_f
        azimuth = r[2].to_f
        @gc.setDirection(azimuth, distance)
        pt = @gc.getDestinationGeographicPoint
        wkt = "POINT (#{pt.getX} #{pt.getY})"
        w.write(:the_geom => @tr.transform(Geo::import_wkt_geometry(wkt)),
                :name => name)
      end
    end
    Geo::FeatureList.open('bnda_lambert.shp') do |w|
      Geo::FeatureList.foreach('~/src/bnda_1_1/bnda_1_1.shp') do |f|
        f[:the_geom] = @tr.transform(f[:the_geom])
        w.write(f)
      end
    end
  end
end

Tokyonizer.new.run

結果

結果を QGIS を使ってプロットすると、次のようになりました。

北ドイツ


ハンブルクがちょうど富山のあたりになります。
キール能登半島のてっぺんあたりになりました。
ブレーメンが加賀っぽいところに入りました。
オスナブリュック舞鶴です。

中部ドイツ


ポツダムが大和だとか座間といったあたりになります。
ライプツィヒが伊豆くらいの距離感です。
マグデブルクが静岡っぽいあたり。
名古屋あたりについては、百キロオーダーの荒っぽい対比を許してもらうと、フォルクスワーゲンウォルフスブルクとベルリンの距離感覚は、豊田市と東京の距離感覚に近いかも知れません。ハノーファーがおおむね名古屋っぽいポジションになります。
カッセルは伊勢でした。
Paderborn, Bielefeld あたりは、ドイツでもちょっと人口の谷間地域になるようです。そこを西に抜けると、大きな人口集中地域があります。

西ドイツ


西ドイツの都市が密集したあたりは、大阪湾あたりに入ります。
ケルンが淡路島の南端の沖に、ボンが紀伊水道に入るようです。デュッセルドルフも淡路島の沖あたりになっています。

南ドイツ

南ドイツは洋上に出てしまい、ベルリンを東京にもってくる方法では距離感がうまく出ません。ベルリンを仙台あたりにもってくるエントリを、あとで書くかもしれません。

それにしても

日本は細長い国で、ドイツは四角い国だなあと思いました。