2024年6月27日木曜日

緯度経度とCAD座標

 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 件のコメント:

コメントを投稿

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

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