家から近いラーメン屋、コンビニ…など、距離順に情報を並べたい時があります。
距離を計算するためには、まず住所から緯度経度を求め、2つの緯度経度から距離を計算します。 平面だったら三平方の定理で簡単なのですが、地球は丸いのでちょっと複雑になります。
住所から緯度経度を求める
住所から緯度経度を求めるAPIはいくつかあります。 GoogleのAPIでも良いのですが、クレジットカードを登録する必要があり、使いすぎたらお金がかかる仕様になっていて、ちょっと不安です。 そこでとっても良心的なサービス ”国土地理院API”です。
登録なしで利用できます。大量にアクセスするのはやめてくださいね、と注意書きがあります。 マスタ登録するたびにリクエストする、といった常識的な使い方をしていきます。
FileMakerではURLを挿入スクリプトでリクエストします。 返ってきた結果(JSON形式)をちょっと形を整えて、緯度フィールド、経度フィールドに値を入れます。 (結果に[]がついていたのでそれを取り除いたり)
ヒュベニの式を使う
▼計算式
Let (
[
%POLE_RADIUS = 6356752 ; // 極半径(短半径)
%EQUATOR_RADIUS = 6378137 ; // 赤道半径(長半径)
%E = .08181919104281579 ; // 離心率
%E2= .006694380022900788 ; // 離心率の2乗
%緯度1rad=Radians ( 緯度1 );
%緯度2rad=Radians ( 緯度2 );
%経度1rad=Radians ( 経度1 );
%経度2rad=Radians ( 経度2 );
%平均緯度=(%緯度1rad+%緯度2rad) / 2; %緯度差=%緯度1rad-%緯度2rad; %経度差=%経度1rad-%経度2rad;
// 子午線・卯酉線曲率半径の分母を求める
%W = Sqrt ( 1-%E2*Sin ( %平均緯度 ) * Sin ( %平均緯度 ) );
// 卯酉線曲率半径を求める
%N = %EQUATOR_RADIUS / %W ;
// 子午線曲率半径を求める
%M = %EQUATOR_RADIUS * (1-%E2) / %W3;
%距離=Sqrt *12)
]; Round ( %距離/1000; 1 ) )
▲コメントは”*”を入れるとイタリックになってしまうので、”//”にしています。
計算式を丸ごと載せてしまうとこんな感じです。 地球の丸みも考慮した計算ができるんですね!
ポータルとボタンバーを使うと、距離を出すためだけのテーブル(家とラーメン屋なら家IDとラーメン屋IDをもったテーブル)を作らずとも、近い距離のリストを表示することができます。
ポータルのフィルタに計算式を入れることができるので、例えば15km圏内のリストを表示させることができます。
ただ、FileMakerのポータルのソートは、フィールドを指定しないとできないので、距離が近い順に並べようと思うと一度どこかフィールドに入れる必要があります。 (私はバーチャルリストを作って、ソートをかけました!)
*1: %緯度差 * %M )2 + (%経度差%N Cos ( %平均緯度