在c#中以指定的半径获取经纬度的范围
Posted
技术标签:
【中文标题】在c#中以指定的半径获取经纬度的范围【英文标题】:Get the Range of Lat Long with in specified Radius in c# 【发布时间】:2014-02-06 08:40:52 【问题描述】:我正在开发一个网站,在该网站上,我的 Location 表中保存了用户的位置经纬度。现在我想使用一个过滤器 SearchByDistance 其值: 5km, 10km, 15km 用户可以通过它根据指定的Range获取结果。
现在我真正想做的是从用户那里获取输入 5km 并从我的表中获取结果,该表在用户保存的范围内 LatLong 在 Location 表中,距离该 LatLong 5 公里。我对此进行了谷歌搜索,并找到了一些链接,例如:
How do I find the lat/long that is x km north of a given lat/long
http://msdn.microsoft.com/en-us/library/system.device.location.geocoordinate.getdistanceto%28v=vs.110%29.aspx
但我无法从上面得到我的要求。请帮忙。谢谢
【问题讨论】:
***.com/questions/19478874/… 【参考方案1】:我认为您的方法可以是,首先创建一个圆(您的中心将是用户经纬度),半径为 5KM 或 10Km,然后从多边形环中找到行。我是为 esri 地图编写的。希望能解决你的问题
Polygon areaOfInterset;
void CreateCircle(double radius)
var point = new MapPoint(Your Lat and Long);// This will be user lat and long on which you want to draw a circle
var graphic = new Graphic();
var circle = new ESRI.ArcGIS.Client.Geometry.PointCollection();
int i = 0;
while (i <= 360)
double degree = (i * (Math.PI / 180));
double x = point.X + Math.Cos(degree) * radius;
double y = point.Y + Math.Sin(degree) * radius;
circle.Add(new MapPoint(x, y));
i++;
var rings = new ObservableCollection<ESRI.ArcGIS.Client.Geometry.PointCollection> circle ;
areaOfInterset = new Polygon Rings = rings;
现在下一个任务是查找行。为此,您可以在循环内使用以下代码。
foreach(MapPoint selectedRow in DatabaseRowsToBeSearched)
var isExist = IsInsideCircle(selectedRow)
bool IsInsideCircle(MapPoint location)
var isInside = false;
foreach (var shape in areaOfInterset.Rings)
for (int i = 0, j = shape.Count - 1; i < shape.Count; j = i++)
if ((((shape[i].Y <= location.Y) && (location.Y < shape[j].Y)) ||
((shape[j].Y <= location.Y) && (location.Y < shape[i].Y))) &&
(location.X < (shape[j].X - shape[i].X) * (location.Y - shape[i].Y) / (shape[j].Y - shape[i].Y) + shape[i].X))
isInside = !isInside;
return isInside;
【讨论】:
您的代码不符合我的要求。在第二段代码中,您正在查找用户的位置,但我已经将用户的当前位置(LatLong)保存在我的表中。我的要求是在用户的 LatLong 中加上半径说 5 公里,然后找到落在这些 LatLong 范围之间的行。希望能解释清楚 我已应用您的代码但未成功。这不可能加上用户在数据库中保存的用户的 LatLong 中的输入吗?我们将得到 MinLatLong 和 MaxLatLong 的范围。有了这个,我们可以轻松地在 LINQ 中触发查询,以获取落在这两个范围内的记录数以上是关于在c#中以指定的半径获取经纬度的范围的主要内容,如果未能解决你的问题,请参考以下文章
JavaRedis通过中心经纬度与半径获取范围内的结果集(类似附近的人)