使用C#在MySQL上存储并获取半径的位置

时间:2015-12-08 14:24:04

标签: c# mysql gps bing-maps

我正在使用C#为Windows 10创建一个应用程序。 此应用程序在MySQL数据库中存储多个位置,并向用户显示由他附近的其他用户(按给定半径)存储的位置。

我想知道存储和检索这些位置的最佳方法。我考虑过检索所有位置并通过代码检查它们是否在半径内,但是对于数据库中的大量条目,这可能变得太有用了。

是否有可以过滤此功能的MySQL功能?

2 个答案:

答案 0 :(得分:0)

  

我考虑过检索所有位置并通过代码检查它们是否在半径内

肯定不想走这条路。总是抓取每条记录并在代码中自己过滤它是不好的,原因很多,其中最重要的是性能。

关系数据库非常擅长查询数据,它主要是定义查询以及如何以您需要的方式存储要查询的数据。在这种情况下,如果我正确理解你,你想要的是:

  

存储地理位置列表,并在地图上给定一个点,返回给定半径内的已知点列表。

您要确保自己要做的第一件事就是存储位置的纬度和经度。所有有意义的计算都将基于此。一旦你有了,剩下的就是数学了。

现在,完全披露,我已经a long time,因为我已经使用了这个。它从未实际投入生产,所以我不知道计算是否完全准确。 (这可能是某个地方我可能会说的错误。)但是,给定一个位置表,这样的东西应该检索一个点的位置,该点按照距该点的距离排序:

SELECT
  Name,
  Address,
  City,
  State,
  Latitude,
  Longitude,
  (
    ACOS(
      COS(@center_latitude * (PI()/180)) *
      COS(@center_longitude * (PI()/180)) *
      COS(Latitude * (PI()/180)) *
      COS(Longitude * (PI()/180)) +
      COS(@center_latitude * (PI()/180)) *
      SIN(@center_longitude * (PI()/180)) *
      COS(Latitude * (PI()/180)) *
      SIN(Longitude * (PI()/180)) +
      SIN(@center_latitude * (PI()/180)) *
      SIN(Latitude * (PI()/180))
    ) *
    (
      (@equatorial_radius * @polar_radius) /
      (
        SQRT(
          (@equatorial_radius * @equatorial_radius) -
          (
            (
              (@equatorial_radius * @equatorial_radius) -
              (@polar_radius * @polar_radius)
            ) *
            (
              COS(@center_latitude) *
              COS(@center_latitude)
            )
          )
        )
      )
    )
  ) AS Miles
FROM
  Places
WHERE
  Miles <= @search_radius

此查询接受中心纬度/长度和半径(距搜索位置的距离)并找到距离中心的距离内的任何已知位置,并记录距离(以英里为单位)(因此我们可以排序并找到最近的距离) 。只要在整个计算过程中始终如一地使用相同的测量值,您就可以使用任何您想要的测量值(公里,米等)。

它还接受地球半径的参数。如果您想要而不是参数化,可以对它们进行硬编码。最初我用过这些:

@equatorial_radius = 3963.190 miles
@polar_radius = 3949.902 miles

(请注意,这个赤道半径相当古老,可能无法解释2004年印度洋地震或此后任何其他重大事件中的地壳位移。)

最终,这应返回半径内的点列表,按距离排序。它有点复杂,因为当时的使用要求非常高的精度,所以在这个查询中,圆圈投射到地球平面上的是地球表面的曲率和从WGS-84椭圆体模型导出的在赤道上凸出。可能有一个更简单的模型,精度较低:)

答案 1 :(得分:0)

或者您也可以查看安装MySQL Spatial Extensions:http://dev.mysql.com/doc/refman/5.7/en/spatial-extensions.html