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

news2025/1/12 1:55:59

存储

  • 定义所需要的容器
  • 定义最大最小经纬度
  • [统计站点信息 在经纬度网站](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;

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

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

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

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<QString,node> Station; //画图使用
        extern QMap<QString,QList<QString> > edge; // 跑最短路
        extern QMap<QString,QSet<QString> > Station_Line; // 站点所属线路总
        extern QMap<QString,QString> 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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1037323.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

寻找单身狗

在一个数组中仅出现一次&#xff0c;其他数均出现两次&#xff0c;这个出现一次的数就被称为“单身狗“。 一.一个单身狗 我们知道异或运算操作符 ^ &#xff0c;它的特点是对应二进制位相同为 0&#xff0c;相异为 1。 由此我们容易知道两个相同的数,进行异或运算得到的结果…

tkinter的Canvas组件,绘画基本知识

一、说明 画布组件是Tkinter画图的最重要组件。画布对象是几何绘制、动画绘制的不二选项&#xff0c;本文专门对画布Canvas进行详细描述&#xff0c;并配以适当代码支持。 二、tkinter的Canvas组件&#xff0c;绘画基本知识 Canvas组件&#xff0c;可以用来绘图&#xff0c;也…

【Java 基础篇】Java反射详解:深入了解Java的镜像世界

Java是一门面向对象的编程语言&#xff0c;其强大之处之一就是能够在运行时检查、获取和操作类、方法、字段等程序元素。这一特性就是通过Java的反射机制实现的。本文将深入介绍Java反射&#xff0c;包括它的基本概念、使用方法、常见应用场景和注意事项。无需担心&#xff0c;…

云计算战略:选择适合你业务的云平台

文章目录 云计算的概述选择云平台的关键因素1. 业务需求2. 预算3. 性能要求4. 数据隐私和合规性 示例&#xff1a;选择适合的云平台业务需求预算性能要求数据隐私和合规性 代码示例&#xff1a;使用云平台服务结论 &#x1f389;欢迎来到云计算技术应用专栏~云计算战略&#xf…

“源启2.0”:从自上而下的解构,到自下而上的重构

从垂直打穿、到应用重构&#xff0c;中电金信赋能行业数字化转型之路既“向下走”、也“向上看”。“向上”先理解和吃透客户的企业战略&#xff0c;进而自上而下地将企业战略拆解为业务架构&#xff0c;“向下”再将业务架构拆解为应用架构和数据架构&#xff0c;并进一步对齐…

JS预解析/编译(变量提升):var(仅声明,无赋值)、function变量 创建作用域

目录 变量提升/预定义 function和var 重名&#xff1a;函数覆盖变量 不执行代码 重复声明&#xff1a;只提升一次 函数形参&#xff1a;变量提升 带 var 和不带 var 全局作用域&#xff1a; window 的属性 私有/函数作用域&#xff1a; 带 var 的是私有变量 IIFE 函…

Linux 终端与进程

有趣的问题 Linux 中的 终端&#xff0c;控制台&#xff0c;TTY&#xff0c;PTY 究竟是什么&#xff1f;它们与进程有什么关系&#xff1f; 历史回顾&#xff1a;控制台 (Console) 控制台是一个直接控制设备的面板 (属于设备的一部分) 计算机设备的控制台&#xff1a;按键 &…

2FSK调制解调VHDL,Quartus

名称&#xff1a;2FSK调制解调VHDL&#xff08;代码在文末付费下载&#xff09; 软件&#xff1a;Quartus 语言&#xff1a;VHDL 要求&#xff1a;使用VHDL实现2FSK的调制和解调&#xff0c;并进行仿真 代码下载&#xff1a;2FSK调制解调VHDL,Quartus_Verilog/VHDL资源下载…

C++ stack queue模拟实现

目录 一.stack 二.queue 三.deque STL中有6大组件&#xff0c;我们前面讲的string/vector/list是容器&#xff0c;还有迭代器&#xff0c;以及算法&#xff08;比如find&#xff0c;swap&#xff0c;reverse&#xff0c;sort&#xff0c;merge函数&#xff09;&#xff0c;仿函…

【Java 基础篇】Java Stream 流详解

Java Stream&#xff08;流&#xff09;是Java 8引入的一个强大的新特性&#xff0c;用于处理集合数据。它提供了一种更简洁、更灵活的方式来操作数据&#xff0c;可以大大提高代码的可读性和可维护性。本文将详细介绍Java Stream流的概念、用法和一些常见操作。 什么是Stream…

bootstrapv4轮播图去除两侧阴影及线框的方法

文章目录 前言一、前提条件&#xff1a;二、bootstrap文档组件展示与实际应用1.官方文档展示如下&#xff1a;没有阴影2.实际应用情况如下&#xff1a; 三、解决方案 前言 这篇文章主要介绍了bootstrapv4轮播图去除两侧阴影及线框的方法,本文通过示例代码给大家介绍的非常详细…

基于微信小程序的项目申报管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言用户微信端的主要功能有&#xff1a;管理员的主要功能有&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉…

【Vue】vue-cli一站式搭建SPA项目

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Vue快速入门》。&#x1f3af;&#x1f3af; &…

vtk- 数据类型(一) 三角链实例代码

三角链实例代码 #include <iostream> #include <string> #include <regex> #include "tuex.h" #include "vtkCylinderSource.h" #include "vtkPolyDataMapper.h" #include "vtkActor.h" #include "vtkRendere…

Java --- MySQL8数据库优化性能查看工具

目录 一、数据库服务器优化步骤 ​编辑二、查看系统性能的参数 三、统计SQL的查询成本&#xff1a;last_query_cost 四、定位执行慢的SQL&#xff1a;慢日志查询 4.1、开启并设置慢查询日志查询参数 4.2、查看慢查询数目 4.3、慢查询日志分析工具&#xff1a;mysqldumps…

MySQL单表查询和多表查询

一、单表查询 素材&#xff1a; 表名&#xff1a;worker-- 表中字段均为中文&#xff0c;比如 部门号 工资 职工号 参加工作等 CREATE TABLE worker (部门号 int(11) NOT NULL,职工号 int(11) NOT NULL,工作时间 date NOT NULL,工资 float(8,2) NOT NULL,政治面貌 varchar(10)…

帆软FineReport决策报表之页面布局

最近在用帆软决策报表绘制首页大屏&#xff0c;记录使用过程&#xff0c;方便查看。 版本&#xff1a;FineReport10.0 第一步、页面布局 页面布局其实就是组件的排列组合&#xff0c;决策报表主区域body有两种布局方式&#xff1a;自适应布局和绝对布局。 1&#xff09;自适应…

C#中实现单元测试的示例流程_MSTest测试项目

一、单元测试简介 1.1、单元测试简介 在《单元测试艺术》一书中对于单元测试的定义是&#xff1a;【一个单元测试是一段代码&#xff0c;这段代码调用一个工作单元&#xff08;指&#xff1a;调用软件中的一个方法&#xff0c;这个方法执行过程中所发生的所有行为以及最后产生…

你好,python!——python基础中的基础

〇、注释 0.1 单行注释 python中用 “# ”来给某一行注释&#xff0c; 他的快捷键是 CTRL / &#xff0c;当注释内容已被注释时&#xff0c;会解除注释 0.2 多行注释 python中用 """ 注释内容 """ 来对内容进行多行注释 ""&q…

DATE和LocalDateTime在Java中有什么区别

在Java中&#xff0c;Date和LocalDateTime是两个表示日期和时间的类&#xff0c;它们有以下区别&#xff1a; 类型&#xff1a;Date是Java旧版提供的日期和时间类&#xff0c;而LocalDateTime是Java 8引入的新日期和时间API中的类。 不可变性&#xff1a;Date是可变类&#x…