2024年6月27日木曜日

緯度経度とCAD座標

ARES マッププラグインは、ESRIやTeigaのマップソリューションを利用しています。

C#のカスタムアプリケーションから緯度経度からCAD座標への相互変換を利用する方法を紹介します。

マッププラグインのGEOマップを有効にして

GEODATA オブジェクトを図面に挿入し、座標変換を利用可能にします。

C++ではGEODATAクラスの座標変換APIが利用できますが、ARESのC#にはGEODATAクラスがありませんでした。しかしPOSITIONMARKER図形クラスはあるのでそれを使って座標変換します。

このプログラムは、POSITIONMARKER 図形を図面に追加して、緯度経度を読み取ったり、緯度経度を設定してXY値を読み取っています。

using Teigha.ApplicationServices;
using Teigha.DatabaseServices;
using Teigha.EditorInput;
using Teigha.Geometry;
using Teigha.Runtime;
using CADException = Teigha.Runtime.Exception;

namespace geodata
{
    public class Class1
    {
        [CommandMethod("TESTCS")]
        public void cmdTestCS()
        {
            var doc = Application.DocumentManager.MdiActiveDocument;
            var ed = doc.Editor;
            var db = doc.Database;
            try
            {
                var id = db.GeoDataObject;
                ed.WriteMessage("\nGEODATA [{0}]", id.Handle.ToString());
            }
            catch (CADException)
            {
                ed.WriteMessage("\nNo GEODATA.");
                return;
            }
            var ret = ed.GetPoint("Specify location");
            if(ret.Status != PromptStatus.OK )
            {
                return;
            }
            var model = db.CurrentSpaceId.GetObject(OpenMode.ForWrite) as BlockTableRecord;
            GeoPositionMarker marker = new GeoPositionMarker();
            marker.Position = ret.Value;
            model.AppendEntity(marker);
            Point3d rts = marker.GeoPosition;
            ed.WriteMessage("\n{0} -> {1}", ret.Value, rts);
            var ret2 = ed.GetString("経度,緯度を入力");
            if (ret2.Status == PromptStatus.OK)
            {
                string text = ret2.StringResult;
                int len = text.IndexOf(",");
                double lon = System.Convert.ToDouble(text.Substring(0, len));
                double lat = System.Convert.ToDouble(text.Substring(len + 1));
                Point3d geo = new Point3d(lon,lat,0);
                marker.GeoPosition = geo;
                rts = marker.Position;
                ed.WriteMessage("\n{0} -> {1}", geo, rts);
            }
            marker.Erase();
        }
    }
}

緯度経度からXYZに変換したときに、 Z がおかしいとき(緯度の値がそのまま入っていることがある)は無視してください。

実行結果

: TESTCS
GEODATA [10E]
Specify location: »
(15086629.5460905,4121448.60999969,0) -> (135.525499071023,34.6871623638417,0)
経度,緯度を入力: » 135.5255,34.6871
(135.5255,34.6871,0) -> (15086629.6495038,4121440.16715828,34.6871)


0 件のコメント:

コメントを投稿

ARESのトリニティ(三位一体)

 ARESのトリニティ戦略、どこがトリニティなんでしょう。 まずはデスクトップCADが、WindowsにもMacにもLinux版もあるというトリニティ。 デスクトップCADと、モバイルCAD(ARES Touch)と、ブラウザとサーバーCAD(ARES Kudo)のトリニティ。 ...