我正在构建一个基于地图的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< = {MAX_LAT_OFFSET} AND Lng> = {MIN_LNG_OFFSET} AND Lng< = {MIN_LNG_OFFSET}"
我想避免查询数据库中的所有坐标并检查所有坐标的距离,看它们是否在半径范围内。
编辑2
在stackoverflow中弹出了一个新建议,似乎很有希望here
如果你们有更好/更准确的答案,我可以向他们敞开心扉。谢谢!
答案 0 :(得分:0)
对于任何可能遇到此问题的人,我所寻求的答案来自here
答案给出了计算纬度和经度中KM /度数的公式
纬度= 10000/90公里 经度= 10000/90 km * 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;
}