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

存储

  • 定义所需要的容器
  • 定义最大最小经纬度
  • [统计站点信息 在经纬度网站](https://map.jiqrxx.com/jingweidu/)
  • 读取统计的信息存储到容器
  • 其他的一些相关函数
    • debug 显示存储的信息
    • 更新最小最大经纬度的函数
    • 获取两点之间的距离 根据经纬度

定义所需要的容器

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; //两站站点共同的线路

定义最大最小经纬度

extern double minLongi;
extern double minLati;
extern double maxLongi;
extern double maxLati;

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

Qt地铁智慧换乘系统浅学( 一 )存储站点,线路信息_第1张图片
统计如下
Qt地铁智慧换乘系统浅学( 一 )存储站点,线路信息_第2张图片

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

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;
}

其他的一些相关函数

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  ";

    }
}

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

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;
}

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

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;
}

你可能感兴趣的:(qt)