|
- /* 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<Mark> 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<Mark> 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<MarkPoint*> MarkPointLayer::getMarkPointVec() {
- return _vecMarkPoint;
- }
-
- MarkPoint* MarkPointLayer::getMarkPoint(int num) {
- return _vecMarkPoint.at(num);
- }
-
- osg::ref_ptr<Mark> 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();
- }
|