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 Address(string street, string city, string state, string postalCode, string country, Location coordinates, AddressAccuracy accuracy) { this._street = street; this._city = city; this._state = state; this._postalCode = postalCode; this._country = country; this._coordinates = coordinates; this._accuracy = accuracy; }
private void ShowResult(string locationName, Location location) { Double radius = 200; if (Request["radius"] != null && Request["radius"] != string.Empty) { if (double.Parse(Request["radius"], Utility.GetNumberFormatInfo()) <= SliderExtender1.Maximum) { radius = double.Parse(Request["radius"], Utility.GetNumberFormatInfo()); } } DistanceUnits distanceunit = DistanceUnits.Miles; if (UnitInKm == true) distanceunit = DistanceUnits.Kilometers; XmlDocument content = new XmlDocument(); XmlElement root = content.CreateElement("root"); //search node XmlElement infoNode = content.CreateElement("location"); infoNode.InnerText = location.ToString().Replace(" ", ""); XmlAttribute nameAttribute = content.CreateAttribute("name"); nameAttribute.Value = locationName; infoNode.Attributes.Append(nameAttribute); XmlAttribute latitudeAttribute = content.CreateAttribute("latitude"); latitudeAttribute.Value = location.Latitude.ToString(); infoNode.Attributes.Append(latitudeAttribute); XmlAttribute longitudeAttribute = content.CreateAttribute("longitude"); longitudeAttribute.Value = location.Longitude.ToString(); infoNode.Attributes.Append(longitudeAttribute); XmlAttribute unitAttribute = content.CreateAttribute("unit"); unitAttribute.Value = distanceunit.ToString().ToLower(); infoNode.Attributes.Append(unitAttribute); XmlAttribute radiusAttribute = content.CreateAttribute("radius"); radiusAttribute.Value = radius.ToString(Utility.GetNumberFormatInfo()); infoNode.Attributes.Append(radiusAttribute); root.AppendChild(infoNode); string selectMembLoc = @" select m.nodeId, m.email, m.loginName, m.password, lat.dataNvarchar as Latitude, lon.dataNvarchar as Longitude, karma.dataInt as Karma, memberdata.text as MemberData, avatar.datanvarchar as Avatar from cmsMember m INNER JOIN cmsPropertyData lat on m.nodeId = lat.contentnodeid INNER JOIN cmsPropertyData lon on m.nodeId = lon.contentnodeid Inner Join cmsPropertyData karma on m.nodeId = karma.contentNodeId Inner Join umbracoNode memberdata on m.nodeId = memberdata.id Inner Join cmsPropertyData avatar on m.nodeId = avatar.contentnodeid where lat.propertytypeid = 43 and lat.dataNvarchar is not null and lat.dataNvarchar != '' and lon.propertytypeid = 34 and lon.dataNvarchar is not null and lon.dataNvarchar != '' and karma.propertytypeid = 32 and avatar.propertytypeid = 39 and CASE WHEN IsNumeric(lat.dataNvarchar) = 1 THEN Cast(lat.dataNvarchar as decimal(10)) ELSE -90 END > @minlat and CASE WHEN IsNumeric(lat.dataNvarchar) = 1 THEN Cast(lat.dataNvarchar as decimal(10)) ELSE 90 END < @maxlat and CASE WHEN IsNumeric(lon.dataNvarchar) = 1 THEN Cast(lon.dataNvarchar as decimal(10)) ELSE -180 END > @minlon and CASE WHEN IsNumeric(lon.dataNvarchar) = 1 THEN Cast(lon.dataNvarchar as decimal(10)) ELSE 180 END < @maxlon;"; SqlConnection conn = new SqlConnection(umbraco.GlobalSettings.DbDSN); SqlCommand commMembLoc = new SqlCommand(selectMembLoc, conn); commMembLoc.Parameters.AddWithValue("@minlat", location.Latitude - Math.Ceiling(radius / 85)); commMembLoc.Parameters.AddWithValue("@maxlat", location.Latitude + Math.Ceiling(radius / 85)); commMembLoc.Parameters.AddWithValue("@minlon", location.Longitude - Math.Ceiling(radius / 85)); commMembLoc.Parameters.AddWithValue("@maxlon", location.Longitude + Math.Ceiling(radius / 85)); conn.Open(); bool found = false; string memberIds = string.Empty; try { SqlDataReader reader = commMembLoc.ExecuteReader(); while (reader.Read()) { int id = reader.GetInt32(0); int karma = reader.IsDBNull(6) ? 0 : reader.GetInt32(6); memberIds += id.ToString() + ";"; Location memberLocation = new Location( double.Parse(reader.GetString(4), Utility.GetNumberFormatInfo()), double.Parse(reader.GetString(5), Utility.GetNumberFormatInfo())); double distance = location.DistanceBetween(memberLocation, distanceunit); //Response.Output.WriteLine("Member " + id.ToString() + "distance " + distance.ToString(Utility.GetNumberFormatInfo())); if (distance <= radius) { found = true; XmlElement memberNode = content.CreateElement("member"); XmlAttribute idAttribute = content.CreateAttribute("id"); idAttribute.Value = id.ToString(); memberNode.Attributes.Append(idAttribute); //name XmlAttribute membernameAttribute = content.CreateAttribute("name"); membernameAttribute.Value = reader.GetString(7); memberNode.Attributes.Append(membernameAttribute); //karma XmlAttribute karmaAttribute = content.CreateAttribute("karma"); karmaAttribute.Value = karma.ToString(); memberNode.Attributes.Append(karmaAttribute); XmlElement distanceNode = content.CreateElement("data"); distanceNode.InnerText = distance.ToString(Utility.GetNumberFormatInfo()); XmlAttribute aliasAttribute = content.CreateAttribute("alias"); aliasAttribute.Value = "distance"; distanceNode.Attributes.Append(aliasAttribute); memberNode.AppendChild(distanceNode); XmlElement avatarNode = content.CreateElement("data"); avatarNode.InnerText = reader.IsDBNull(8) ? string.Empty : reader.GetString(8); XmlAttribute avatarAliasAttribute = content.CreateAttribute("alias"); avatarAliasAttribute.Value = "avatar"; avatarNode.Attributes.Append(avatarAliasAttribute); memberNode.AppendChild(avatarNode); XmlElement locationNode = content.CreateElement("data"); locationNode.InnerText = memberLocation.ToString(); XmlAttribute locationAliasAttribute = content.CreateAttribute("alias"); locationAliasAttribute.Value = "location"; locationNode.Attributes.Append(locationAliasAttribute); memberNode.AppendChild(locationNode); root.AppendChild(memberNode); } } } finally { conn.Close(); } if (!found) { pnlCreateTopic.Visible = false; } ViewState["MemberLocatorMemberIds"] = memberIds.Length > 0 ? memberIds.Substring(0, memberIds.Length - 1) : ""; //litResults.Text = root.InnerXml.ToString() + ResultsXslt; content.AppendChild(root); litResults.Text = umbraco.macro.GetXsltTransformResult(content, umbraco.macro.getXslt("MemberLocator.xslt")); ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), "MemberLocator", umbraco.macro.GetXsltTransformResult(content, umbraco.macro.getXslt("MemberLocatorScript.xslt")), true); if (Member.GetCurrentMember().Groups.ContainsKey(4686)) { ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), "MemberLocatorTiny", "topictiny();", true); } }
private void loadMap() { try { //check if event if (Request["event"] != null) { umbraco.presentation.nodeFactory.Node e = new umbraco.presentation.nodeFactory.Node(Convert.ToInt32(Request["event"])); ShowResult(e.Name, new Location( Convert.ToDouble(e.GetProperty("latitude").Value, Utility.GetNumberFormatInfo()), Convert.ToDouble(e.GetProperty("longitude").Value, Utility.GetNumberFormatInfo()))); } else { //address supplied if (Request["s"] != null && Request["s"] != string.Empty) { litMultipleResults.Text = MultipleResultsCaption; litResults.Text = string.Empty; pnlMultiple.Visible = false; IGeoCoder geoCoder = new GoogleGeoCoder(Utility.GetGoogleMapsKey()); Address[] addresses = geoCoder.GeoCode(Request["s"]); if (addresses.Length == 0)//no results { pnlCreateTopic.Visible = false; litResults.Text = umbraco.macro.GetXsltTransformResult(umbraco.content.Instance.XmlContent, umbraco.macro.getXslt(ResultsXslt)); ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), "test", umbraco.macro.GetXsltTransformResult(umbraco.content.Instance.XmlContent, umbraco.macro.getXslt("MemberLocatorScript.xslt")), true); } else { if (addresses.Length > 1)//multiple results, need to choose first { //show the first result ShowResult(addresses[0].ToString(), new Location(addresses[0].Coordinates.Latitude, addresses[0].Coordinates.Longitude)); //rblLocations.Items.Clear(); //foreach (Address address in addresses) //{ // rblLocations.Items.Add(new ListItem(address.ToString(), address.Coordinates.Latitude.ToString(Utility.GetNumberFormatInfo()) + "," + address.Coordinates.Longitude.ToString(Utility.GetNumberFormatInfo()))); //} //pnlMultiple.Visible = true; } else// single result, ok show results { ShowResult(addresses[0].ToString(), new Location(addresses[0].Coordinates.Latitude, addresses[0].Coordinates.Longitude)); } } } else //node address, use member location { //use member location Member current = Member.GetCurrentMember(); Location memberLocation = new Location( double.Parse(current.getProperty("latitude").Value.ToString(), Utility.GetNumberFormatInfo()), double.Parse(current.getProperty("longitude").Value.ToString(), Utility.GetNumberFormatInfo()) ); ShowResult(current.getProperty("location").Value.ToString(), memberLocation); } } } catch(Exception ex) { if (Request["debug"] == null) { litResults.Text = "Error displaying locator results"; } else { litResults.Text = ex.Message + "</br>" + ex.StackTrace; } } // } }
public Distance DistanceBetween(Location location) { return this.DistanceBetween(location, DistanceUnits.Miles); }
static Location() { Empty = new Location(); }