ARESマッププラグインでGEOマップを挿入するとGEODATAオブジェクトが用意されます。
GEODATAオブジェクトが利用可能なときは、transformToLonLatAlt() や transformFromLonLatAlt() で緯度経度とXYの変換が可能です。
#include "stdafx.h"
#include "FXHeaders.h" // ほとんどのCFxのヘッダが入っている
#include "DbGeoData.h" // GEODATA オブジェクト
//===========================================================
// JDTESTCmd Class
//===========================================================
int JDTESTCmd::Execute(CFxCommandContext* pCmdCtx)
{
CFxDocumentPtr doc = pCmdCtx->GetFxDocument();
CFxUserIO* io = doc->GetFxUserIO();
CFxDatabasePtr db = doc->GetFxDatabase();
CFxString prompt;
OdResult rt;
// 座標系が用意できているか
OdDbObjectId geoid;
if (oddbGetGeoDataObjId(db, geoid) != eOk)
{
io->Write(L"\nNo GEODATA.");
return RTNORM;
}
OdDbGeoDataPtr geodata = geoid.safeOpenObject();
OdGePoint3d p1;
OdGePoint3d p2;
int rc = io->GetPoint(L"\n位置を指定 : ", nullptr, nullptr, &p1);
if (rc == RTNORM)
{
rt = geodata->transformToLonLatAlt(p1, p2);
prompt.format(L"\n(%f,%f,%f) - (%f,%f,%f) ", p1.x, p1.y, p1.z, p2.x, p2.y, p2.z);
io->Write(prompt);
OdError e(rt);
io->Write(e.description());
}
rc = io->GetString(false, L"\n経度,緯度を指定 : ", L"", &prompt);
if (rc == RTNORM)
{
rc = io->GetUnitsFormatter()->StringToPoint(p1, prompt);
if (rc == RTNORM)
{
rt = geodata->transformFromLonLatAlt(p1,p2);
prompt.format(L"\n(%f,%f,%f) - (%f,%f,%f)", p1.x, p1.y, p1.z, p2.x, p2.y, p2.z);
io->Write(prompt);
OdError e(rt);
io->Write(e.description());
}
}
return RTNORM;
}
transformFromLonLatAlt() の戻り値 XYZ の Z がおかしいとき(緯度の値がそのまま入っていることがある)は無視してください。
0 件のコメント:
コメントを投稿