LeafletでL.circleを使わずに円を描く

プログラムに興味はなく、マウスでぐりぐりしたい場合は地図に円を描くへ。

Leafletで地図上に円を描いてみるテスト。今どきは円なんて標準装備なのですが、GMap ver.2とかYLLPoint時代には自力で描かざるをえなかったんですよ!原理的にはGoogle Maps APIで円を描く。を、どうぞ。なお、OpenStreetMapや地理院地図はWGS84でいいと思いますが、旧日本測地系の地図や地球以外の星の場合は、赤道半径や離心率を適宜変更のこと。

/*
  引数はL.Circle()に準拠
  なお、options.radius は "m"単位
*/
function pseudoCircle(latlng, options) {

  // どんな形で来るのかわからんので
  var pos = L.latLng(latlng);

  // 360角形で近似
  var vertex = 360;

  // 赤道半径(m) (WGS-84)
  var EquatorialRadius = 6378137;

  // 扁平率の逆数 : 1/f (WGS-84)
  var F = 298.257223563;

  // 離心率の2乗
  var E = ((2 * F) -1) / Math.pow(F, 2);

  // 赤道半径 × π
  var PI_ER = Math.PI * EquatorialRadius;

  // 1 - e^2 sin^2 (θ)
  var TMP = 1 - E * Math.pow(pos.lat * Math.PI / 180, 2);

  // 経度1度あたりの長さ(m)
  var arc_lat = (PI_ER * (1 - E)) / (180 * Math.pow(TMP, 3/2)); 

  // 緯度1度あたりの長さ(m)
  var arc_lng = (PI_ER * Math.cos(pos.lat * Math.PI / 180)) / (180 * Math.pow(TMP, 1/2)); 

  var points = new Array();
  for (var i = 0; i <= vertex; i++) {
    var rad = (i / (vertex / 2)) * Math.PI;
    var lat = (options.radius / arc_lat) * Math.sin(rad) + pos.lat;
    var lng = (options.radius / arc_lng) * Math.cos(rad) + pos.lng;
    points[i] = [lat, lng];
  }
  return L.polygon(points, options);
}

OKWave系のq5546321でgoogle mapsのほうにリンクされている、「東京スカイツリーが見える範囲」を相変わらずサンプルにしています。中心点は (35.710139, 139.810833)、半径は95,330mにしています。(この範囲でスカイツリーが見えることを保障するわけではありません!念のため)