ESRIのArcGSI Onlineで座標系を変換する方法

ESRIのArcGSIで特定の地点を中心に指定した寸法の形状などを生成しようとして調べていたのだけれど、 緯度経度ではもちろん、WebMercatorでも当然だが、うまくいかず困っていた。 具体的には、特定の点から10m東に移動した点などを算出したい場合などである。

結論としては、地図上で距離や角度を簡易に扱うには、平面直角座標系に変換してから処理すればよい。 (そもそも平面直角座標系とはそのための座標系だと理解した。)

さらに、ArcGISで、その平面直角座標系へ変換する方法がわかりにくかったのだが、 projectionというのを使えばよいらしい。

気を付けないといけないのは、標準ではWebMercatorまたは緯度経度で指定しないと地図に表示できないところ。 平面直角座標系で演算したあとは、WebMercatorに戻す必要がある。

コードを以下に示しておく。

// 最低限必要なインポートは必要。漏れもあるかも。
import Point from "@arcgis/core/geometry/Point";
import SpatialReference from "@arcgis/core/geometry/SpatialReference";
import * as projection from "@arcgis/core/geometry/projection";


      // WGS 1984 Web Mercator (Auxiliary Sphere)
      const webMercatorRef = new SpatialReference({ wkid: 3857 });
      // JGD_2011_Japan_Zone_9
      const ref = new SpatialReference({ wkid: 6679 });

      // 緯度経度で指定したPoint(他の座標系でもよい)
      const p = new Point({latitude: lat, longitude: lng});

      // 平面直角座標系に変換した座標
      const { x, y } = projection.project(p, ref) as Point;

      // 100m移動した平面直角座標系のPoint
      const p1 = new Point({
        spatialReference: ref,
        x + 100,
        y,
      });

      // 100m移動したWebMercatorのPoint
      const p2 = projection.project(p1, webMercatorRef) as Point;

ちなみに、wkid:3857はWebMercatorを示す。ArcGISの場合、WebMercatorのwkid:102100が使われていることもある。 ちなみにwkid:6677は、日本の関東周辺を対象とした平面直角座標系。

参考

https://developers.arcgis.com/javascript/latest/display-projected-geometries/#view-the-effects-of-a-projection