【问题标题】:Calculating Distance Between 2 Cities [closed]计算2个城市之间的距离[关闭]
【发布时间】:2010-09-06 14:50:10
【问题描述】:

你如何计算两个城市之间的距离?

【问题讨论】:

标签: algorithm math trigonometry geography


【解决方案1】:

您找到城市的纬度/经度,然后对纬度/经度坐标使用距离估计算法。

【讨论】:

    【解决方案2】:

    您使用Haversine formula

    【讨论】:

      【解决方案3】:

      你可以使用A*算法来找到这两个城市之间的最短路径,这样你就知道了距离。

      【讨论】:

        【解决方案4】:

        如果你需要一个代码示例,我想我有一个可以在家里挖出来,但就像之前的许多答案一样,你需要一个 long / lat db 来进行计算

        【讨论】:

          【解决方案5】:

          最好使用查找表来获得两个城市之间的距离。

          这是有道理的,因为 * 计算距离 a 的公式计算量很大。 * 城市之间的距离不太可能改变。

          因此,除非您需要非常具体(例如来自卫星或某些地形的地形图或地形算法或其他东西),否则您实际上应该将城市列表和它们之间的距离保存到表格中并根据需要进行查找.

          【讨论】:

            【解决方案6】:

            如果你在飞机上工作并且想要Euclidean distance“如乌鸦飞”:

            // Cities are points x0,y0 and x1,y1 in kilometers or miles or Smoots[1]
            dx = x1 - x0;
            dy = y1 - y0;
            dist = sqrt(dx*dx + dy*y);
            

            不需要三角函数!只是 Pythagorean theorem 和平方总是正的事实,所以你不需要 dx = abs(x1 - x0) 等来获得一个正数来传递给 sqrt()。

            请注意,您可能可以在一行中执行此操作,并且编译器会可能将其简化为上面的等效代码:

            dist = sqrt((x1-x0)*(x1-x0) + (y1-y0)*(y1-y0));
            

            [1]http://en.wikipedia.org/wiki/Smoot

            【讨论】:

              【解决方案7】:

              如果您谈论的是在真正的球形行星(如地球)上两个真实城市之间的最短距离,您需要great circle distance

              【讨论】:

                【解决方案8】:

                如果您需要考虑地球的曲率,大圆距离就是您要寻找的。 The Wikipedia article 可能比我更好地解释了公式的工作原理,还有this aviation formulary page 对此进行了更详细的介绍。

                虽然公式只是难题的第一部分,但如果您需要对任意城市进行这项工作,则需要一个位置数据库来获取纬度/经度。幸运的是,您可以从Geonames.org 免费获得这个,尽管有可用的商业数据库(询问谷歌)。因此,一般来说,查找您想要的两个城市,获取纬度/经度坐标并将它们代入公式,如 the Wikipedia Worked Example

                其他建议:

                • 对于完整的商业解决方案, 使用了PC Miler 由许多货运公司 计算运费。
                • 调用 Google Maps(或其他)API。如果您每天需要处理很多请求,请考虑将结果缓存在服务器上。
                • 另外非常重要如果您认为需要对数据进行分组,请考虑为城市、郊区、城镇等建立一个等价数据库。不过,这会变得非常复杂,而且您可能找不到一种万能的解决方案来解决您的问题。

                最后但并非最不重要的一点是,Joel 不久前写了一篇关于这个问题的文章,所以你去吧:New Feature: Job Search

                【讨论】:

                【解决方案9】:

                我最近在这方面做了很多工作。我发现 SQL2008 的新特性确实让这变得简单。我可以在不到一秒的时间内找到 100k 记录表的 Xkm 内的所有点......不太破旧。

                与 vincenty 公式(椭球假设,地球是什么)相比,我测试中的大圆(球形假设)方法大约相差 2.5 英里。

                真正的诀窍是获取经纬度..为此我使用的是 Google。

                【讨论】:

                  【解决方案10】:

                  @Jared - 对您的代码示例的小修正。第一个代码示例的最后一行应为:

                  dist = sqrt(dx*dx + dy*dy);
                  

                  【讨论】:

                    【解决方案11】:

                    在 SQL Server 2008 中使用地理类型很容易做到这一点。

                    SELECT geography::Point(lat1, lon1, 4326).STDistance(geography::Point(lat2, lon2, 4326))
                    -- computes distance in meters using eliptical model, accurate to the mm
                    

                    4326 是 WGS84 椭球地球模型的 SRID

                    【讨论】:

                    • 在 PostGIS 中同样简单。
                    【解决方案12】:

                    我同意,一旦您获得信息,如果它不会更改,请以某种方式存储它。 @Marko Tinto 感谢 T-SQL 示例。对于那些无法访问 SQL Server 或更喜欢其他方法的人:如果您需要高精度,请查看Wikipedia's entry on the Vincenty algorithm 了解更多信息。我相信有一个 js 实现,它(如果还没有的话)很容易移植到其他语言。此外,该页面底部有一个指向 geographicLib 的链接,据称它比 Vincenty 算法精确 1000 倍(如果您有这么好的数据,这可能很重要)。

                    您为什么要使用 Vincenty 方法之类的方法?因为地球不是一个完美的球体,这样的方法允许输入更准确的主轴和次轴来模拟地球。

                    【讨论】:

                      【解决方案13】:

                      我使用distancy 如此简单干净

                      【讨论】:

                        【解决方案14】:

                        您可以从 google map api 获取两个城市之间的距离。 这是它在 Python 中的实现

                        #!/usr/bin/python
                        import requests
                        from sys import argv 
                        def get_distance(origin,destination):
                            gmap='http://maps.googleapis.com/maps/api/distancematrix/json'
                            payload={"origins":origin,"destinations":destination,"sensor":'false' }
                            try:
                                a=requests.get(gmap,params=payload)
                                data = a.json()
                                origin = str(data['origin_addresses'][0])
                                destination= str(data['destination_addresses'][0])
                                distance = data['rows'][0]['elements'][0]['distance']['text']
                                return distance,origin,destination
                            except Exception,e:
                                print "The %s or %destination does not exists :(" %(origin,destination)
                                exit()
                        
                        if __name__=="__main__":
                            if len(argv)<3:
                                print "sorry Check the format"
                            else:
                                origin=argv[1]
                                destination=argv[2]
                                distance,origin,destination=get_distance(origin,destination)
                                print "%s ---> %s    :   %s" %(origin,destination,distance)
                        

                        示例链接:https://gist.github.com/sarathsp06/cf063e47bcc515b51c84

                        【讨论】:

                          猜你喜欢
                          • 2016-06-07
                          • 2011-03-25
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2011-11-17
                          • 2021-11-14
                          • 1970-01-01
                          相关资源
                          最近更新 更多