ベルリンが東京だったら
ベルリンとその周辺都市の位置関係を、東京とその周辺に移植してみます。
中心位置と周辺との位置関係は、「方位角と距離」に直してから目的位置に移植します。緯度経度のままでは距離的に正確な移植にならず、地理的に離れた両方の位置で正確な投影法はふつう存在しないためです。
ベルリンとその周辺の位置関係を、方位角と距離に変換
ベルリンとその周辺の都市の位置は、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 あたりは、ドイツでもちょっと人口の谷間地域になるようです。そこを西に抜けると、大きな人口集中地域があります。
南ドイツ
南ドイツは洋上に出てしまい、ベルリンを東京にもってくる方法では距離感がうまく出ません。ベルリンを仙台あたりにもってくるエントリを、あとで書くかもしれません。
それにしても
日本は細長い国で、ドイツは四角い国だなあと思いました。