public Distance DistanceBetween(Location location, DistanceUnits units) { double num = (units == DistanceUnits.Miles) ? 3956.545 : 6378.2;//3438.147; double num2 = this.ToRadian(location.Latitude - this.Latitude); double num3 = this.ToRadian(location.Longitude - this.Longitude); double d = Math.Pow(Math.Sin(num2 / 2.0), 2.0) + ((Math.Cos(this.ToRadian(this.Latitude)) * Math.Cos(this.ToRadian(location.Latitude))) * Math.Pow(Math.Sin(num3 / 2.0), 2.0)); double num5 = 2.0 * Math.Asin(Math.Min(1.0, Math.Sqrt(d))); return new Distance(num * num5, units); }
public IEnumerable<ExpandoObject> GetNearest(string address, int parentId, int docTypeFilter, string locationPropAlias, int numberOfSearchResults) { UmbracoHelper help = new UmbracoHelper(UmbracoContext); var nodesToSearchThrough = help.TypedContent(parentId) .Descendants().Where(c => c.DocumentTypeId == docTypeFilter).Where("Visible"); var distanceunit = DistanceUnits.Kilometers; var items = new List<GeoItem>(); var searchLocation = new Location(); var r = GoogleGeoCoder.CallGeoWS(address); searchLocation = new Location(r.Results[0].Geometry.Location.Lat, r.Results[0].Geometry.Location.Lng); foreach (var node in nodesToSearchThrough) { var itemLocation = new Location( Convert.ToDouble(node.GetProperty(locationPropAlias).Value.ToString().Split(',')[0], Utility.NumberFormatInfo), Convert.ToDouble(node.GetProperty(locationPropAlias).Value.ToString().Split(',')[1], Utility.NumberFormatInfo)); items.Add(new GeoItem(node,itemLocation,searchLocation.DistanceBetween(itemLocation,distanceunit))); } items.Sort(new GeoItemComparer()); var retval = new List<ExpandoObject>(); foreach (GeoItem geo in items.Take(numberOfSearchResults)) { IPublishedContent node = ((IPublishedContent)geo.Node); var obj = new ExpandoObject() as IDictionary<string, Object>; obj.Add("Distance", geo.Distance); obj.Add("Latitude", geo.Location.Latitude); obj.Add("Longitude", geo.Location.Longitude); obj.Add("Name", node.Name); obj.Add("Url", node.Url); foreach (var nodeProp in node.Properties) { obj.Add(nodeProp.Alias, nodeProp.Value); } retval.Add((ExpandoObject)obj); } return retval; }
static Location() { Empty = new Location(); }
public Distance DistanceBetween(Location location) { return this.DistanceBetween(location, DistanceUnits.Miles); }
public GeoItem(object Node, Location Location, Distance Distance) { this.Node = Node; this.Location = Location; this.Distance = Distance; }