• Qt地铁智慧换乘系统浅学( 一 )存储站点,线路信息


    定义所需要的容器

    extern QMap<QString,node> Station; //画图使用
    extern QMap<QString,QList<QString> > edge; // 跑最短路
    extern QMap<QString,QSet<QString> > Station_Line; // 站点所属线路总
    extern QMap<QString,QColor> LineColor;  //  线路颜色
    extern QMap<QString,QMap<QString,int> >dp; //两站点之间的距离;
    extern QMap<QString,QMap<QString,QSet<QString> > >mp; //两站站点共同的线路
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    定义最大最小经纬度

    extern double minLongi;
    extern double minLati;
    extern double maxLongi;
    extern double maxLati;
    
    • 1
    • 2
    • 3
    • 4

    统计站点信息 在经纬度网站

    在这里插入图片描述
    统计如下
    在这里插入图片描述

    读取统计的信息存储到容器

    void infoinit(){
        QFile file(":/src/lineQD.txt");
        file.open(QIODevice::ReadOnly);
        if(!file.isOpen()){
            qDebug()<<"error open";
            return ;
        }
    
        QTextStream in(&file);
        QString buffer;
        QString Name;
        QString Color;
        int Num;
        while(true){
            in>>buffer>>buffer;
            if(in.atEnd()) break;
            in>>buffer>>buffer; // line name;
            Name = buffer;
    
            in>>buffer>>buffer; // line color
            Color = buffer;
    
            in>>buffer>>buffer; // start
            in>>buffer;         // end
    
            in>>buffer>>buffer; // station num
            Num = buffer.toInt();
            /*
            extern QMap Station; //画图使用
            extern QMap > edge; // 跑最短路
            extern QMap > Station_Line; // 站点所属线路总
            extern QMap LineColor;  //  线路颜色
            */
            node stal[100];
            for(int i=0;i<Num;i++){  // 存储站点信息,存储站点所属线路
                in>>buffer>>stal[i].name>>stal[i].e>>stal[i].n;
                updateBound(stal[i].e,stal[i].n);
                qDebug()<<stal[i].name<<stal[i].e<<stal[i].n<<"\n";
                qDebug()<<maxLati<<" "<<maxLongi<<" "<<minLati<<" "<<minLongi<<"\n";
                Station[stal[i].name] = stal[i];
                Station_Line[stal[i].name].insert(Name);
            }
    
            node sta,laststa;
          for(int i=0;i<Num;i++){  //存储边
                if(i>=1) { edge[stal[i].name].append(stal[i-1].name); dp[stal[i].name][stal[i-1].name]=getDistance(stal[i].name,stal[i-1].name);
                    mp[stal[i].name][stal[i-1].name].insert(Name);
                }
                if(i<Num-1) { edge[stal[i].name].append(stal[i+1].name); dp[stal[i].name][stal[i+1].name]=getDistance(stal[i].name,stal[i+1].name);
                    mp[stal[i].name][stal[i+1].name].insert(Name);
                }
            }
            LineColor[Name] = QColor(Color);   // 存储线路颜色
    
        }
        for(auto i:Station.keys()) {
            Station[i].coord.setX((Station[i].n-minLongi)/(maxLongi-minLongi)*1000+30);
            Station[i].coord.setY((Station[i].e-minLati)/(maxLati-minLati)*500+30);
            qDebug()<<Station[i].coord<<"\n";
        }
        return;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    其他的一些相关函数

    debug 显示存储的信息

    void ddebug(){
        qDebug()<<"all station\n";
        QString s;
        for(auto &i:Station.keys()) {
            qDebug()<<Station[i].name<<" "<<Station[i].e<<" "<<Station[i].w<<" ";
            s=*Station_Line[i].begin();
            if(Station_Line[i].size()!=1)  qDebug()<<"black  ";
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    更新最小最大经纬度的函数

    void updateBound(const double lati,const double longi){
        if(minLati>lati)
            minLati=lati;
        if(maxLati<lati)
            maxLati=lati;
        if(minLongi>longi)
            minLongi=longi;
        if(maxLongi<longi)
            maxLongi=longi;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    获取两点之间的距离 根据经纬度

    int getDistance(const QString sta1,const QString sta2){
        const double EARTH_RADIUS = 6378.137;
    
        double rlati1 = Station[sta1].w * M_PI / 180;
        double rlati2 = Station[sta2].w * M_PI / 180;
        double rlongi1 = Station[sta1].e * M_PI / 180;
        double rlongi2 = Station[sta2].e * M_PI / 180;
    
        double vlongi = abs(rlongi1-rlongi2);
        double vlati = abs(rlati1-rlati2);
    
        double h = HaverSin(vlati)+cos(rlati1)*cos(rlati2)*HaverSin(vlongi);
        double ret = 2*EARTH_RADIUS*asin(sqrt(h));
    
        return (int)(ret*1000);
    }
    double HaverSin(double theta)
    {
        double v = sin(theta / 2);
        return v * v;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
  • 相关阅读:
    【限时免费】20天拿下华为OD笔试之 【模拟】2023B-整数分解【欧弟算法】全网注释最详细分类最全的华为OD真题题解
    算法-具有所有最深节点的最小子树(Kotlin)
    360+城市空气质量指数-日度数据、良好天数统计(2001-2022年)
    Python-装饰器
    Java BigInteger比Long更大的整数自增转字符串存储
    ACM(数论)总结1
    从零开始学习CANoe 系列文章目录汇总
    Git常用命令汇总
    基于MatLab实现LSB(最低有效位)算法完成图片数字水印隐写功能
    随手记录: Macbook/MacOS 快速安装brew
  • 原文地址:https://blog.csdn.net/qq_52172364/article/details/133142861