C# 以c为单位,在指定半径内获取Lat Long的范围#

C# 以c为单位,在指定半径内获取Lat Long的范围#,c#,geolocation,geometry,C#,Geolocation,Geometry,我正在一个网站上工作,在这个网站上,我将用户的位置Lat和Long保存在我的位置表中。现在我想使用一个过滤器SearchByDistance,它的值为:5km,10km,15km,通过它,用户可以根据指定的范围获得结果 现在我真正想做的是从用户那里获取输入,比如说5km,然后从我的表中获取结果,该结果在位置表中用户保存的LatLong范围内,距离LatLong表5km。我在谷歌上找到了一些链接,如: 但是我无法从上面得到我的要求。请帮忙。谢谢我认为你的方法可以是,首先创建一个半径为5KM或1

我正在一个网站上工作,在这个网站上,我将用户的位置Lat和Long保存在我的位置表中。现在我想使用一个过滤器SearchByDistance,它的值为:5km10km15km,通过它,用户可以根据指定的范围获得结果

现在我真正想做的是从用户那里获取输入,比如说5km,然后从我的表中获取结果,该结果在位置表中用户保存的LatLong范围内,距离LatLong表5km。我在谷歌上找到了一些链接,如:


但是我无法从上面得到我的要求。请帮忙。谢谢

我认为你的方法可以是,首先创建一个半径为5KM或10Km的圆(你的中心将是用户的lat和long),然后从多边形环中找到行。我为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};
}
interset的多边形区域;
空心圆(双半径)
{
var point=new MapPoint(您的Lat和Long);//这将是您要在其上绘制圆的用户Lat和Long
var graphic=新图形();
var circle=new ESRI.ArcGIS.Client.Geometry.PointCollection();
int i=0;

while(我)你的代码不符合我的要求。在第二段代码中,你找到了用户的位置,但我已经找到了用户的当前位置(LatLong)保存在我的表格中。我的要求是在用户的LatLong中加上半径,比如说5km,然后找到介于这些LatLong范围之间的行。我希望我能够清楚地解释一下。我已经应用了你的代码。我没有成功。这不可能加上用户在数据库中保存的用户LatLong中的输入。我希望我们将得到Min的范围有了它,我们可以很容易地在LINQ中启动查询,以获得这两个范围内的记录数
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;
}