【问题标题】:Get offset for calculating all GPS coordinates in an x meter radius from starting GPS coordinate从起始 GPS 坐标计算 x 米半径内的所有 GPS 坐标的偏移量
【发布时间】:2018-08-28 03:32:37
【问题描述】:

我正在构建一个基于地图的 xamarin 应用程序。我有一个保存在数据库中的坐标列表。我想查询从给定起始坐标落入 x 米内的所有坐标。我只是想知道如何获得纬度和经度所需的偏移量来制定我的查询。我知道如何获得坐标之间的距离,但我得到的大多数其他搜索都返回了相同的公式。任何帮助,将不胜感激。非常感谢!

我查看了以下帖子,这些帖子在我发布此帖子时被建议:

how to check radius of 10 meter from x,y position - from GPS

Calculating gps coordinate radius

编辑

进一步指定要求

我希望能够得到 2 个可用于此类查询的数字范围

"SELECT * FROM tbl_Coordinates WHERE Lat >= {MIN_LAT_OFFSET} AND Lat = {MIN_LNG_OFFSET} AND Lng

我想避免查询数据库中的所有坐标并检查所有坐标的距离以查看它们是否在半径范围内。

编辑 2

stackoverflow 中出现了一个看起来很有希望的新建议here

如果你们有更好/更准确的答案,我愿意接受。谢谢!

【问题讨论】:

  • 什么数据库?有些具有地理空间功能:例如MSSQL, MongoDB
  • 嗨 Fildor,我正在使用 SQL Server 2012,但如果可能的话,我宁愿在代码中执行此操作。谢谢。
  • 对不起,我不明白您的要求与链接有何不同,或者正如您提到的“我知道如何获取坐标之间的距离,但我得到的大多数其他搜索都返回了相同的公式。” - 你想要什么?
  • 你的意思是你想要一个算法,给你一个范围内的坐标列表,然后你打算用这些坐标来看看你是否有匹配?我认为这是错误的方式。
  • 要求是我需要偏移量,即我需要从 lat 和 lng 添加或减去多少才能在 db 上进行适当的半径搜索,因为我正在搜索 db 并且我想要避免查询数据库中的所有坐标并检查所有坐标的距离以查看它们是否在半径内。我希望能够得到 2 个数字范围,我可以将它们用于这样的查询“SELECT * FROM tbl_Coordinates WHERE Lat >= {MIN_LAT_OFFSET} AND Lat = {MIN_LNG_OFFSET} AND Lng

标签: c# xamarin.forms gps maps


【解决方案1】:

对于任何可能遇到此问题的人,我正在寻找的答案来自here

答案给出了计算经纬度多少公里/度的公式

纬度 = 10000/90 公里 经度 = 10000/90 公里 * cos(纬度)

我最终得到了这段代码,其中 iLat 和 iLng 是中心坐标

//This is in meters
        double iDistanceDegreeConverter = 10000.0 / 90.0 * 1000;
        double iLatOffset = iRadius / iDistanceDegreeConverter;
        double iLngOffset = iRadius / (Math.Cos(iLat) * iDistanceDegreeConverter);
        double iMaxLat = Math.Abs(iLat) + iLatOffset;
        double iMinLat = Math.Abs(iLat) - iLatOffset;
        double iMaxLng = Math.Abs(iLng) + iLngOffset;
        double iMinLng = Math.Abs(iLng) - iLngOffset;
        if (iLat < 0)
        {
            iMaxLat *= -1;
            iMinLat *= -1;
        }
        if (iLng < 0)
        {
            iMaxLng *= -1;
            iMinLng *= -1;
        }
        if (iMaxLat > 90)
        {
            double iOverflow = iMaxLat - 90;
            iMaxLat = 90 - iOverflow;
        }
        if (iMinLat < -90)
        {
            double iOverflow = -90 + iMinLat;
            iMinLat = -90 + iOverflow;
        }
        if (iMaxLng > 180)
        {
            double iOverflow = iMaxLng - 180;
            iMaxLng = 180 - iOverflow;
        }
        if (iMinLng < -180)
        {
            double iOverflow = -180 + iMinLng;
            iMinLng = -180 + iOverflow;
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    相关资源
    最近更新 更多