/* Copyright(c)--Navinfo--Author:fangzurui--date:2023-06-30 */ #include "MarkPointLayer.h" MarkPointLayer::MarkPointLayer() {} MarkPointLayer::~MarkPointLayer() {} MarkPoint* MarkPointLayer::createMarkPoint(MapPoint mapPoint) { // 创建地图点 MarkPoint* markPoint = new MarkPoint(); markPoint->setMapPoint(mapPoint); // 创建序号 std::string strTextName = QObject::tr("T").toStdString() + std::to_string(_markPointCount + 1); markPoint->setId(strTextName); // 创建pText osg::ref_ptr pMark = nullptr; osgEarth::Color color(135.0 / 255.0 , 206.0 / 255.0, 250.0 / 255.0, 1.0); pMark = MarkLayer::createMark(mapPoint, color, "ubuntu", 20, strTextName, 48, 48, QCoreApplication::applicationDirPath().toStdString() + "\\bubble.png"); markPoint->setMarkPtr(pMark); return markPoint; } MarkPoint* MarkPointLayer::createMarkPoint(MapPoint mapPoint, std::string name) { // 创建地图点 MarkPoint* markPoint = new MarkPoint(); markPoint->setMapPoint(mapPoint); // 创建序号 markPoint->setId(name); // 创建pText osg::ref_ptr pMark = nullptr; osgEarth::Color color(135.0 / 255.0 , 206.0 / 255.0, 250.0 / 255.0, 1.0); pMark = MarkLayer::createMark(mapPoint, color, "ubuntu", 20, name, 48, 48, QCoreApplication::applicationDirPath().toStdString() + "\\bubble.png"); markPoint->setMarkPtr(pMark); return markPoint; } void MarkPointLayer::addMarkPoint(MarkPoint* markPoint) { _vecMarkPoint.push_back(markPoint); _markPointCount++; } std::vector MarkPointLayer::getMarkPointVec() { return _vecMarkPoint; } MarkPoint* MarkPointLayer::getMarkPoint(int num) { return _vecMarkPoint.at(num); } osg::ref_ptr MarkPointLayer::getMarkPtr(int num) { return _vecMarkPoint.at(num)->getMarkPtr(); } MapPoint MarkPointLayer::getMapPoint(int num) { return _vecMarkPoint.at(num)->getMapPoint(); } std::string MarkPointLayer::getId(int num) { return _vecMarkPoint.at(num)->getId(); } void MarkPointLayer::setMarkPointCount(int num) { _markPointCount = num; } int MarkPointLayer::getMarkPointCount() { return _markPointCount; } void MarkPointLayer::resetMarkPointCount() { _markPointCount = 0; } void MarkPointLayer::deleteMarkPoint(int num) { // 判断下标是否符合要求 if(isExists(num) == true) { // 删除下标对应的指针 _vecMarkPoint.at(num)->getMarkPtr().release(); delete _vecMarkPoint.at(num); // 从数组中移除 _vecMarkPoint.erase(_vecMarkPoint.begin() + num); } else { return; } } int MarkPointLayer::findKeyFromValue(MarkPoint* markPoint) { if(_vecMarkPoint.size() == 1) { return -1; } int index = std::find(_vecMarkPoint.begin(), _vecMarkPoint.end(), markPoint) - _vecMarkPoint.begin(); return index; } bool MarkPointLayer::isExists(int num) { // 数组是否为空 if(_vecMarkPoint.empty() == true) { return false; } // 下标是否越界 if(num > _vecMarkPoint.size() || num < 0) { return false; } // 下标对应值是否为空 if(_vecMarkPoint.at(num) == nullptr) { _vecMarkPoint.erase(_vecMarkPoint.begin() + num); return false; } return true; } bool MarkPointLayer::isExists(std::string strId) { // 数组是否为空 if(_vecMarkPoint.empty() == true) { return false; } // 判断传入指针是否为空 if(strId.empty() == true) { return false; } // 元素是否在数组中存在 for(int i = 0; i < _vecMarkPoint.size(); i++) { if(_vecMarkPoint.at(i)->getId() == strId) { return true; } } return false; } bool MarkPointLayer::isExists(MarkPoint* markPoint) { // 数组是否为空 if(_vecMarkPoint.empty() == true) { return false; } // 判断传入指针是否为空 if(markPoint == nullptr) { return false; } // 元素是否在数组中存在 if(std::find(_vecMarkPoint.begin(), _vecMarkPoint.end(), markPoint) == _vecMarkPoint.end()) { return false; } return true; } MarkPoint* MarkPointLayer::matchMarkPoint(MapPoint mapPoint) { double pi = 3.1415926535897932384626433832795; double earthRadius = 6378.137; for(int i = 0; i < _vecMarkPoint.size(); i++) { double lon1 = _vecMarkPoint.at(i)->getMapPoint()._dLon; double lat1 = _vecMarkPoint.at(i)->getMapPoint()._dLat; double lon2 = mapPoint._dLon; double lat2 = mapPoint._dLat; double a = (lat1 * pi / 180) - (lat2 * pi / 180); double b = (lon1 * pi / 180) - (lon2 * pi / 180); double s = 2 * asin(sqrt(pow(sin(a / 2), 2) + cos(lat1 * pi /180) * cos(lat2 * pi /180) * pow(sin(b / 2), 2))); s = s * earthRadius; s = s * 1000; // 距离小于10 if(s < 10) { return _vecMarkPoint.at(i); } else { continue; } } return nullptr; } void MarkPointLayer::clearMarkPoint() { // 先释放所有的指针 for(int i = 0; i < _vecMarkPoint.size(); i++) { _vecMarkPoint.at(i)->getMarkPtr().release(); } _vecMarkPoint.clear(); }