首页 > 解决方案 > 如何按距离对地理位置进行排序?

问题描述

我有一个 XML 文件,其中包含有关巴士站的信息(例如路线号、巴士站的坐标(纬度、经度)等)。
我有一个任务:使用坐标打印最长的路线
一般来说,我理解算法:

  1. 在路线编号和其坐标矢量之间进行匹配。
  2. 获取每条路线的长度(它是一条虚线,假设它是直的以使代码更简单,没关系),其中顶点是带有坐标的公共汽车站。
  3. 找到最大值并打印出来。

问题是:数据未排序,因此如果我尝试获取两点之间的距离(例如ii + 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 公里

如果我得到任何帮助,那就太棒了。谢谢。

标签: c++algorithmsortinggeolocation

解决方案


推荐阅读