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)