/////////////////////////////////////////////////////////////////////////////// // Copyright (C) 2002-2025, Open Design Alliance (the "Alliance"). // All rights reserved. // // This software and its documentation and related materials are owned by // the Alliance. The software may only be incorporated into application // programs owned by members of the Alliance, subject to a signed // Membership Agreement and Supplemental Software License Agreement with the // Alliance. The structure and organization of this software are the valuable // trade secrets of the Alliance and its suppliers. The software is also // protected by copyright law and international treaty provisions. Application // programs incorporating this software must include the following statement // with their copyright notices: // // This application incorporates Open Design Alliance software pursuant to a license // agreement with Open Design Alliance. // Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance. // All rights reserved. // // By use of this software, its documentation or related materials, you // acknowledge and accept the above terms. /////////////////////////////////////////////////////////////////////////////// #include "OdaCommon.h" #include "StdAfx.h" #include "DgGeoMapImagePEImpl.h" #include "DgGeoMapImage.h" #include "DgBingMaps.h" #include "DgBingMapsCache.h" #include "DgKMLPlacemark.h" //---------------------------------------------------------- // // OdDgGeoMapImageImplPE // //---------------------------------------------------------- OdGiRasterImagePtr OdDgGeoMapImageImplPE::createGeoMapImage(const OdGeExtents3d& extXYZ, const OdDgGeoDataInfo* pGeoDataInfo, const OdDgModel* pBaseModel, const OdGeExtents2d& extImage, OdDgGeoMapImagePE::OdDgGeoMapImageType uType, OdDgGeoMapImagePE::OdDgGeoMapImageResolution uResolution, int iLOD, const OdDgElementId& idPlacemark) const { OdGiRasterImagePtr pRet = OdGiRasterImagePtr(); OdDgGeoDataPEPtr pGeoDataPE = pGeoDataInfo; OdDgModelPtr pModel; if (!pBaseModel) { OdDgElementId idOwner = pGeoDataInfo->ownerId(); if (!idOwner.isNull()) pModel = idOwner.openObject(OdDg::kForRead); } else pModel = pBaseModel; OdDgGeoDataCoordinateConverterPtr pCoordConvertor = pGeoDataPE->createGeoDataCoordinateConvertor(pGeoDataInfo, pModel); if( pCoordConvertor.isNull() ) return pRet; // Calculate offset OdGeVector3d vrOffset = OdGeVector3d::kIdentity; if( !idPlacemark.isNull() ) { OdDgElementPtr pPlacemarkElm = idPlacemark.openObject(OdDg::kForRead); if( !pPlacemarkElm.isNull() ) { if( pPlacemarkElm->isKindOf(OdDgKMLPlacemark2d::desc()) ) { OdDgKMLPlacemark2dPtr pPlacemark = pPlacemarkElm; OdGePoint3d ptPlacemarkLL(pPlacemark->getLongitude() * 180 / OdaPI, pPlacemark->getLatitude() * 180 / OdaPI, pPlacemark->getElevation()); OdGePoint3d ptOrigin(pPlacemark->getOrigin().x, pPlacemark->getOrigin().y, 0.0); OdGePoint3d ptPlacemarkXYZ; if( pCoordConvertor->transformLLPointXYZ(ptPlacemarkLL, ptPlacemarkXYZ) == eOk ) vrOffset = ptPlacemarkXYZ - ptOrigin; } else if (pPlacemarkElm->isKindOf(OdDgKMLPlacemark3d::desc())) { OdDgKMLPlacemark3dPtr pPlacemark = pPlacemarkElm; OdGePoint3d ptPlacemarkLL(pPlacemark->getLongitude() * 180 / OdaPI, pPlacemark->getLatitude() * 180 / OdaPI, pPlacemark->getElevation()); OdGePoint3d ptOrigin = pPlacemark->getOrigin(); OdGePoint3d ptPlacemarkXYZ; if( pCoordConvertor->transformLLPointXYZ(ptPlacemarkLL, ptPlacemarkXYZ) == eOk ) vrOffset = ptPlacemarkXYZ - ptOrigin; } } } // Calculate LOD double dImageWidth = extImage.maxPoint().x - extImage.minPoint().x; double dImageHeight = extImage.maxPoint().y - extImage.minPoint().y; if( iLOD == 0 ) iLOD = OdDgGeoMapHelper::getOptimalLOD(extXYZ, pCoordConvertor, pGeoDataInfo, uResolution, dImageWidth, dImageHeight) - uResolution; iLOD = odmin(odmax(iLOD + uResolution, OdDgBingMaps::MIN_LOD), OdDgBingMaps::MAX_LOD); OdDgGeoMapHelper::getMap(pGeoDataInfo, pModel, pCoordConvertor, uType, iLOD, uResolution, extXYZ, vrOffset, dImageWidth, dImageHeight, pRet); return pRet; } //----------------------------------------------------------