1点からの半径検索は、Google 投影に変換してから検索するのがベストプラクティス? -- 第2回: Google Mercator 投影の縮尺係数 --

Google Mercator 投影上でのユークリッド距離に (135, 35) での縮尺係数を掛けることで周辺との距離を計算したとき、大圏距離とどのくらいの違いが発生するのかを検証してみましょう。

とりあえず Mercator 座標系で話を進めます

d:id:hfu:20080128 では、いわゆる Google 座標系を導入しましたが、当面の話を簡単にするために、Google 座標系ではなくて Marcetor 座標系で話を進めていきたいと思います。
Mercator 座標系の EPSG コードは EPSG:41001。Google 座標系と Mercator 座標系との違いは、Google 座標系は地球を球とみなすが、Mercator 座標系は地球を楕円体とみなすことです。

Mercator 座標系でのユークリッド距離を、距離計測始点での縮尺係数で換算し、表を出力するスクリプト

# geotools.rb を使う
require 'geotools'

# 経緯度座標系
wgs84 = Geo::import_epsg_crs(4326)
# Mercator 座標系
mercator = Geo::import_epsg_crs(41001)

# 経緯度座標系から Mercator 座標系への変換
tr = Geo::Transform.new(wgs84, mercator)
# Mercator 座標系から経緯度座標系への変換
itr = Geo::Transform.new(mercator, wgs84)
# Geotools 提供の測地計算器。大圏距離を計算してくれる。
gc = Geo::Tools::GeodeticCalculator.new

# 縮尺係数を計算するための「微小変位」。ツッコミどころかもしれない。
dx = 1
dy = 1

# 原点 P から Mercator 座標系で (dx, dy) だけずれた点 Q の経緯度を算出する。
p_wgs84 = Geo::import_wkt_geometry('POINT(135 35)')
p_mercator = tr.transform(p_wgs84)
p_mercator.apply(Geo::Tools::AffineTransformation.translationInstance(dx, dy))
q_wgs84 = itr.transform(p_mercator)

# PQ 間の大圏距離を計算する。GeodeticCalculator にはグッドラッパーが必要だ。
gc.setStartingGeographicPoint(p_wgs84.getX, p_wgs84.getY)
gc.setDestinationGeographicPoint(q_wgs84.getX, q_wgs84.getY)
d = gc.getOrthodromicDistance # 地形やジオイドは考慮していないということだ。楕円体上。

# Mercator 座標系上の距離を大圏距離に変換するという意味での縮尺係数を算出
scale_factor = d / Math.sqrt(dx ** 2 + dy ** 2)

p_wgs84 = Geo::import_wkt_geometry('POINT(135 35)')
p_mercator = tr.transform(p_wgs84)
print "|方位角|大圏距離|メルカトル座標系上の距離|縮尺係数で換算|大圏距離と換算距離の差|差の大圏距離に対する比|\n"
-180.step(170, 10) do |azimuth|
  1.upto(5) do |p|
    d_orthodromic = 3 * 10 ** p
    gc.setDirection(azimuth, d_orthodromic)
    q = gc.getDestinationGeographicPoint
    q_wgs84 = 
      Geo::import_wkt_geometry("POINT (#{q.getX} #{q.getY})")
    q_mercator = tr.transform(q_wgs84)
    d_mercator = Math.sqrt((p_mercator.getX - q_mercator.getX) ** 2 +
                           (p_mercator.getY - q_mercator.getY) ** 2)
    print "|#{azimuth}度|#{d_orthodromic}m|#{d_mercator}m|#{(d_mercator * scale_factor)}m|#{(d_orthodromic - d_mercator * scale_factor)}m|#{sprintf('%.6f', (d_orthodromic - d_mercator * scale_factor) / d_orthodromic * 100.0)}%|\n"
  end
end

評価結果

評価結果は、次の表のとおりになります。3km 範囲の検索をしたときに、距離の歪み 0.02% 以下になるようです。歪みの大きさの評価についてはあとで書くことにします。また、方位角によって歪みの大きさが大きく異なっているようですので、この対策についてもあとで書くことにします。

方位角 大圏距離 メルカトル座標系上の距離 縮尺係数で換算 大圏距離と換算距離の差 差の大圏距離に対する比
-180度 30m 36.582826043944806m 29.999948446852827m 5.1553147173422076e-5m 0.000172%
-180度 300m 365.8228448405862m 299.99504337678565m 0.0049566232143547495m 0.001652%
-180度 3000m 3657.687129424885m 2999.5065221492437m 0.4934778507563351m 0.016449%
-180度 30000m 36522.97651944356m 29950.868513896057m 49.131486103942734m 0.163772%
-180度 300000m 360069.99751058966m 295277.389166168m 4722.610833832005m 1.574204%
-170度 30m 36.58282695844624m 29.999949196794777m 5.080320522310444e-5m 0.000169%
-170度 300m 365.8229362623194m 299.99511834768265m 0.0048816523173513815m 0.001627%
-170度 3000m 3657.6962609767374m 2999.5140105287496m 0.4859894712503774m 0.016200%
-170度 30000m 36523.8802584742m 29951.609630077077m 48.39036992292313m 0.161301%
-170度 300000m 360151.57307298976m 295344.28565643873m 4655.714343561267m 1.551905%
-160度 30m 36.58282967682914m 29.99995142601968m 4.857398031887783e-5m 0.000162%
-160度 300m 365.82320774285813m 299.99534097679714m 0.004659023202862045m 0.001553%
-160度 3000m 3657.7233787939367m 2999.5362486444433m 0.46375135555672387m 0.015458%
-160度 30000m 36526.56495108308m 29953.811227071394m 46.18877292860634m 0.153963%
-160度 300000m 360394.62583034555m 295543.6024118414m 4456.397588158608m 1.485466%
-150度 30m 36.58283411377493m 29.99995506456157m 4.493543843153702e-5m 0.000150%
-150度 300m 365.82365101890286m 299.9957044877646m 0.004295512235387378m 0.001432%
-150度 3000m 3657.7676625335043m 2999.572563769537m 0.42743623046317225m 0.014248%
-150度 30000m 36530.95171931241m 29957.408620574297m 42.59137942570305m 0.141971%
-150度 300000m 360794.1065160251m 295871.19875340076m 4128.801246599236m 1.376267%
-140度 30m 36.58284012828042m 29.999959996789997m 4.000321000319218e-5m 0.000133%
-140度 300m 365.8242526162404m 299.99619783098234m 0.003802169017660617m 0.001267%
-140度 3000m 3657.827770148541m 2999.6218553510616m 0.37814464893835975m 0.012605%
-140度 30000m 36536.911409693785m 29962.29589757104m 37.70410242896105m 0.125680%
-140度 300000m 361341.5142734201m 296320.10350672767m 3679.896493272332m 1.226632%
-130度 30m 36.5828472897612m 29.999965869601844m 3.4130398155696184e-5m 0.000114%
-130度 300m 365.82499426574935m 299.99680602475627m 0.0031939752437324387m 0.001065%
-130度 3000m 3657.901880495991m 2999.6826299506024m 0.3173700493975957m 0.010579%
-130度 30000m 36544.26802779705m 29968.32873285763m 31.671267142370198m 0.105571%
-130度 300000m 362024.7900715425m 296880.42759689037m 3119.5724031096324m 1.039857%
-120度 30m 36.58285613824323m 29.99997312584838m 2.6874151618727637e-5m 0.000090%
-120度 300m 365.82585345485177m 299.9975106075227m 0.002489392477286856m 0.000830%
-120度 3000m 3657.9877474036775m 2999.753045582265m 0.24695441773519633m 0.008232%
-120度 30000m 36552.803480249604m 29975.32827775992m 24.67172224008027m 0.082239%
-120度 300000m 362828.21015032096m 297539.276667642m 2460.7233323580003m 0.820241%
-110度 30m 36.58286564763317m 29.999980924076098m 1.9075923901823444e-5m 0.000064%
-110度 300m 365.8268040832807m 299.99829017561365m 0.0017098243863529206m 0.000570%
-110度 3000m 3658.08276705705m 2999.8309669735536m 0.16903302644641371m 0.005634%
-110度 30000m 36562.26355342039m 29983.086062986407m 16.91393701359266m 0.056380%
-110度 300000m 363732.32090868306m 298280.6976860326m 1719.302313967375m 0.573101%
-100度 30m 36.58287577923371m 29.999989232551048m 1.0767448952009318e-5m 0.000036%
-100度 300m 365.82781727357263m 299.9991210479057m 8.78952094296892e-4m 0.000293%
-100度 3000m 3658.184055944731m 2999.914029485045m 0.08597051495507912m 0.002866%
-100度 30000m 36572.36502061087m 29991.369826919465m 8.630173080535315m 0.028767%
-100度 300000m 364713.96590687684m 299085.7010858123m 914.2989141877042m 0.304766%
-90度 30m 36.58288623025002m 29.999997802964668m 2.197035332329733e-6m 0.000007%
-90度 300m 365.8288622192499m 299.9999779613768m 2.2038623171738436e-5m 0.000007%
-90度 3000m 3658.288539921951m 2999.9997121473507m 2.8785264930775156e-4m 0.000010%
-90度 30000m 36582.803737588634m 29999.93015440231m 0.0698455976889818m 0.000233%
-90度 300000m 365746.4616405188m 299932.4049119094m 67.59508809057297m 0.022532%
-80度 30m 36.58289668105391m 30.00000637320409m -6.373204090692752e-6m -0.000021%
-80度 300m 365.8299071648335m 300.0008348747711m -8.348747711011129e-4m -0.000278%
-80度 3000m 3658.393044996683m 3000.085412110788m -0.08541211078818378m -0.002847%
-80度 30000m 36593.26354159784m 30008.507774421698m -8.507774421697832m -0.028359%
-80度 300000m 366799.97939921624m 300796.347965702m -796.3479657020071m -0.265449%
-70度 30m 36.58290680454814m 30.000014675031416m -1.4675031415833928e-5m -0.000049%
-70度 300m 365.8309203677581m 300.00166575742264m -0.001665757422642855m -0.000555%
-70度 3000m 3658.4943951492846m 3000.168524862916m -0.16852486291600144m -0.005617%
-70度 30000m 36603.42572673477m 30016.841330441923m -16.841330441922764m -0.056138%
-70度 300000m 367842.183391157m 301651.0131026099m -1651.013102609897m -0.550338%
-60度 30m 36.58291631088766m 30.00002247075762m -2.24707576208516e-5m -0.000075%
-60度 300m 365.831871056031m 300.00244537458894m -0.00244537458894456m -0.000815%
-60度 3000m 3658.5895074472965m 3000.2465222279525m -0.24652222795248235m -0.008217%
-60度 30000m 36612.97882597209m 30024.67540220781m -24.675402207809384m -0.082251%
-60度 300000m 368839.1580399093m 302468.58766695496m -2468.5876669549616m -0.822863%
-50度 30m 36.58292464888138m 30.0000293083754m -2.9308375399494935e-5m -0.000098%
-50度 300m 365.8327303398722m 300.0031500350465m -0.0031500350464739313m -0.001050%
-50度 3000m 3658.675488341146m 3000.3170313345972m -0.31703133459723176m -0.010568%
-50度 30000m 36621.628393164734m 30031.768527532662m -31.76852753266212m -0.105895%
-50度 300000m 369756.62855747563m 303220.96442963136m -3220.9644296313636m -1.073655%
-40度 30m 36.582932319352516m 30.000035598587598m -3.559858759771828e-5m -0.000119%
-40度 300m 365.8334721141886m 300.0037583311695m -0.003758331169478879m -0.001253%
-40度 3000m 3658.749720123164m 3000.377905517226m -0.37790551722582677m -0.012597%
-40度 30000m 36629.1064510458m 30037.900950179428m -37.90095017942804m -0.126337%
-40度 300000m 370561.43930709816m 303880.95392768556m -3880.953927685565m -1.293651%
-30度 30m 36.58293833318203m 30.000040530261685m -4.053026168548968e-5m -0.000135%
-30度 300m 365.83407380967924m 300.0042517548781m -0.004251754878112024m -0.001417%
-30度 3000m 3658.809941678113m 3000.427290535805m -0.4272905358047865m -0.014243%
-30度 30000m 36635.18025927042m 30042.88181014349m -42.88181014349175m -0.142939%
-30度 300000m 371223.2080360111m 304423.6410270168m -4423.641027016798m -1.474547%
-20度 30m 36.58294276775706m 30.00004416685942m -4.4166859421324034e-5m -0.000147%
-20度 300m 365.83451713286934m 300.00461530450747m -0.004615304507467499m -0.001538%
-20度 3000m 3658.8543179856265m 3000.4636815717536m -0.4636815717535683m -0.015456%
-20度 30000m 36639.660058243615m 30046.55549402146m -46.55549402146062m -0.155185%
-20度 300000m 371716.0283779515m 304827.7810689592m -4827.781068959215m -1.609260%
-10度 30m 36.58294547760498m 30.000046389085167m -4.6389085166964605e-5m -0.000155%
-10度 300m 365.83478861854195m 300.00483793783195m -0.004837937831950967m -0.001613%
-10度 3000m 3658.8814971785127m 3000.485970018918m -0.48597001891812397m -0.016199%
-10度 30000m 36642.40547289502m 30048.806886461956m -48.80688646195631m -0.162690%
-10度 300000m 372020.0585126319m 305077.10265925265m -5077.102659252647m -1.692368%
0度 30m 36.582946391776204m 30.000047138756326m -4.713875632589293e-5m -0.000157%
0度 300m 365.83488003956154m 300.00491290814375m -0.004912908143751338m -0.001638%
0度 3000m 3658.890649816487m 3000.4934756902144m -0.49347569021438176m -0.016449%
0度 30000m 36643.33030057186m 30049.56529650371m -49.56529650371158m -0.165218%
0度 300000m 372122.8213332086m 305161.3738775519m -5161.373877551872m -1.720458%
10度 30m 36.58294547760498m 30.000046389085167m -4.6389085166964605e-5m -0.000155%
10度 300m 365.83478861951227m 300.0048379386277m -0.004837938627701988m -0.001613%
10度 3000m 3658.8814971781894m 3000.485970018653m -0.48597001865300626m -0.016199%
10度 30000m 36642.40547289502m 30048.806886461956m -48.80688646195631m -0.162690%
10度 300000m 372020.05851263163m 305077.10265925236m -5077.102659252356m -1.692368%
20度 30m 36.58294276712m 30.000044166337m -4.416633699833028e-5m -0.000147%
20度 300m 365.83451713286934m 300.00461530450747m -0.004615304507467499m -0.001538%
20度 3000m 3658.8543179856265m 3000.4636815717536m -0.4636815717535683m -0.015456%
20度 30000m 36639.660058243615m 30046.55549402146m -46.55549402146062m -0.155185%
20度 300000m 371716.0283779515m 304827.7810689592m -4827.781068959215m -1.609260%
30度 30m 36.58293833318203m 30.000040530261685m -4.053026168548968e-5m -0.000135%
30度 300m 365.8340738087479m 300.00425175411436m -0.004251754114363848m -0.001417%
30度 3000m 3658.809941678113m 3000.427290535805m -0.4272905358047865m -0.014243%
30度 30000m 36635.18025927042m 30042.88181014349m -42.88181014349175m -0.142939%
30度 300000m 371223.20803601394m 304423.6410270191m -4423.641027019126m -1.474547%
40度 30m 36.5829323205498m 30.000035599569436m -3.559956943632869e-5m -0.000119%
40度 300m 365.8334721141886m 300.0037583311695m -0.003758331169478879m -0.001253%
40度 3000m 3658.749720123164m 3000.377905517226m -0.37790551722582677m -0.012597%
40度 30000m 36629.1064510458m 30037.900950179428m -37.90095017942804m -0.126337%
40度 300000m 370561.43930709816m 303880.95392768556m -3880.953927685565m -1.293651%
50度 30m 36.58292464888138m 30.0000293083754m -2.9308375399494935e-5m -0.000098%
50度 300m 365.8327303398722m 300.0031500350465m -0.0031500350464739313m -0.001050%
50度 3000m 3658.675488341146m 3000.3170313345972m -0.31703133459723176m -0.010568%
50度 30000m 36621.628393164734m 30031.768527532662m -31.76852753266212m -0.105895%
50度 300000m 369756.6285574742m 303220.96442963014m -3220.9644296301412m -1.073655%
60度 30m 36.582916309274566m 30.000022469434793m -2.2469434792782295e-5m -0.000075%
60度 300m 365.8318710544179m 300.0024453732661m -0.0024453732660845162m -0.000815%
60度 3000m 3658.5895074472965m 3000.2465222279525m -0.24652222795248235m -0.008217%
60度 30000m 36612.97882597532m 30024.675402210458m -24.675402210457833m -0.082251%
60度 300000m 368839.1580399077m 302468.5876669536m -2468.587666953623m -0.822863%
70度 30m 36.58290680804877m 30.000014677902126m -1.467790212572595e-5m -0.000049%
70度 300m 365.8309203660078m 300.0016657559873m -0.0016657559872896854m -0.000555%
70度 3000m 3658.4943951492846m 3000.168524862916m -0.16852486291600144m -0.005617%
70度 30000m 36603.42572673477m 30016.841330441923m -16.841330441922764m -0.056138%
70度 300000m 367842.183391157m 301651.0131026099m -1651.013102609897m -0.550338%
80度 30m 36.58289667555086m 30.000006368691285m -6.368691284563965e-6m -0.000021%
80度 300m 365.8299071629992m 300.00083487326685m -8.348732668537195e-4m -0.000278%
80度 3000m 3658.393044996683m 3000.085412110788m -0.08541211078818378m -0.002847%
80度 30000m 36593.26354159784m 30008.507774421698m -8.507774421697832m -0.028359%
80度 300000m 366799.97939921624m 300796.347965702m -796.3479657020071m -0.265449%
90度 30m 36.58288623025002m 29.999997802964668m 2.197035332329733e-6m 0.000007%
90度 300m 365.8288622192499m 299.9999779613768m 2.2038623171738436e-5m 0.000007%
90度 3000m 3658.2885399238135m 2999.999712148878m 2.8785112181139993e-4m 0.000010%
90度 30000m 36582.80373758677m 29999.930154400783m 0.0698455992169329m 0.000233%
90度 300000m 365746.46164051694m 299932.4049119079m 67.59508809208637m 0.022532%
100度 30m 36.58287577923371m 29.999989232551048m 1.0767448952009318e-5m 0.000036%
100度 300m 365.82781727357263m 299.9991210479057m 8.78952094296892e-4m 0.000293%
100度 3000m 3658.184055944731m 2999.914029485045m 0.08597051495507912m 0.002866%
100度 30000m 36572.365020607205m 29991.369826916456m 8.630173083543923m 0.028767%
100度 300000m 364713.96590687684m 299085.7010858123m 914.2989141877042m 0.304766%
110度 30m 36.58286564238223m 29.999980919770035m 1.908022996488512e-5m 0.000064%
110度 300m 365.826804085031m 299.998290177049m 0.001709822950999751m 0.000570%
110度 3000m 3658.08276705705m 2999.8309669735536m 0.16903302644641371m 0.005634%
110度 30000m 36562.26355342039m 29983.086062986407m 16.91393701359266m 0.056380%
110度 300000m 363732.32090868306m 298280.6976860326m 1719.302313967375m 0.573101%
120度 30m 36.582856136630134m 29.999973124525553m 2.6875474446796943e-5m 0.000090%
120度 300m 365.82585345485177m 299.9975106075227m 0.002489392477286856m 0.000830%
120度 3000m 3657.9877474020645m 2999.753045580942m 0.24695441905805637m 0.008232%
120度 30000m 36552.80348025121m 29975.328277761237m 24.671722238763323m 0.082239%
120度 300000m 362828.2101503193m 297539.27666764066m 2460.723332359339m 0.820241%
130度 30m 36.58284728833433m 29.999965868431733m 3.413156826681529e-5m 0.000114%
130度 300m 365.82499426574935m 299.99680602475627m 0.0031939752437324387m 0.001065%
130度 3000m 3657.901880495991m 2999.6826299506024m 0.3173700493975957m 0.010579%
130度 30000m 36544.26802779705m 29968.32873285763m 31.671267142370198m 0.105571%
130度 300000m 362024.7900715411m 296880.42759688926m 3119.5724031107384m 1.039857%
140度 30m 36.58284012828042m 29.999959996789997m 4.000321000319218e-5m 0.000133%
140度 300m 365.8242526150431m 299.9961978300005m 0.003802169999516991m 0.001267%
140度 3000m 3657.827770146146m 2999.621855349098m 0.3781446509019588m 0.012605%
140度 30000m 36536.9114096914m 29962.29589756908m 37.70410243091828m 0.125680%
140度 300000m 361341.5142734201m 296320.10350672767m 3679.896493272332m 1.226632%
150度 30m 36.58283411377493m 29.99995506456157m 4.493543843153702e-5m 0.000150%
150度 300m 365.82365101890286m 299.9957044877646m 0.004295512235387378m 0.001432%
150度 3000m 3657.767662530711m 2999.572563767246m 0.4274362327541894m 0.014248%
150度 30000m 36530.95171931241m 29957.408620574297m 42.59137942570305m 0.141971%
150度 300000m 360794.1065160251m 295871.19875340076m 4128.801246599236m 1.376267%
160度 30m 36.582829676192084m 29.999951425497258m 4.8574502741871584e-5m 0.000162%
160度 300m 365.82320774285813m 299.99534097679714m 0.004659023202862045m 0.001553%
160度 3000m 3657.723378794574m 2999.536248644966m 0.46375135503421916m 0.015458%
160度 30000m 36526.564951082444m 29953.811227070873m 46.18877292912657m 0.153963%
160度 300000m 360394.6258303449m 295543.60241184087m 4456.397588159132m 1.485466%
170度 30m 36.582826958122794m 29.999949196529535m 5.080347046515499e-5m 0.000169%
170度 300m 365.82293626199595m 299.9951183474174m 0.004881652582582774m 0.001627%
170度 3000m 3657.6962609767374m 2999.5140105287496m 0.4859894712503774m 0.016200%
170度 30000m 36523.88025847355m 29951.609630076546m 48.39036992345427m 0.161301%
170度 300000m 360151.57307298976m 295344.28565643873m 4655.714343561267m 1.551905%