c++ - 如何按距离对地理位置进行排序?
问题描述
我有一个 XML 文件,其中包含有关巴士站的信息(例如路线号、巴士站的坐标(纬度、经度)等)。
我有一个任务:使用坐标打印最长的路线。
一般来说,我理解算法:
- 在路线编号和其坐标矢量之间进行匹配。
- 获取每条路线的长度(它是一条虚线,假设它是直的以使代码更简单,没关系),其中顶点是带有坐标的公共汽车站。
- 找到最大值并打印出来。
问题是:数据未排序,因此如果我尝试获取两点之间的距离(例如i和i + 1),结果将是错误的,因为在这两个点之间的地理上还有其他点(还有更远的地方在数组中),它们将被忽略 -> 长度大小也将是错误的。
有什么办法可以解决吗?
这是我设法做到的:
double getDistance(double lat1, double long1, double lat2, double long2) {
double la1 = lat1 * M_PI / 180.0;
double la2 = lat2 * M_PI / 180.0;
// Haversine
double dlat = (lat2 - lat1) * M_PI / 180.0;
double dlong = (long2 - long1) * M_PI / 180.0;
double ans = (sin(dlat / 2) * sin(dlat / 2)) +
cos(la1) * cos(la2) * sin(dlong / 2) * sin(dlong / 2);
double c = 2 * atan2(sqrt(ans), sqrt(1 - ans));
double R = 6371;
double d = R * c; // in metres
return d;
}
void getLongestRoute(vector<elementXML> transport, string transportName) {
// key - routeNumber, value - vector of coordinates
map<string, vector<pair<double, double>>> routesData;
// getting each route
for (int i = 0; i < transport.size(); i++) {
for (int j = 0; j < transport.at(i).getRoutes().size(); j++) {
routesData[transport.at(i).getRoutes().at(j)].push_back(transport.at(i).getCoordinates());
}
}
double maxLength = 0.0;
string max = "";
double length = 0.0;
for (const auto &routes : routesData) {
for (int i = 0; i < routes.second.size() - 1; i++) {
length += getDistance(routes.second.at(i).first, routes.second.at(i).second,
routes.second.at(i + 1).first, routes.second.at(i + 1).second);
}
if (length > maxLength) {
maxLength = length;
max = routes.first;
}
length = 0;
}
cout << "Longest route for " << transportName << " - " << "#" << max << ", length - "
<< round(maxLength) << " km" << endl;
}
我从控制台获得的示例:
BUS 最长路线 - #487,长度 - 1050 公里 // 预计约 90 公里
如果我得到任何帮助,那就太棒了。谢谢。
解决方案
推荐阅读
- java - 安装时 Red Hat 在 vs 代码中抛出错误的 Java(TM) 语言支持
- python - 如何计算两个日期时间值之间的持续时间(以分钟为单位)
- blazor - Blazor 服务器:范围服务的问题
- c# - 如何设置实体框架核心连接超时?
- python - 使用 python 排列 output.txt?
- r - 使用 betapart 和 ddecay 包的距离衰减错误
- arrays - VBA - 如何创建水平二维数组
- java - 在java中获得字符串排列的有效/快速方法
- r - 为什么 unlist() 将字符串列表转换为数字?
- laravel - Laravel Telegram bot 错误请求:字符串必须以 UTF-8 编码