示例#1
0
        /// <summary>
        /// Retrieves the reuqest URL for the query.
        /// </summary>
        /// <returns>A string URL for the query.</returns>
        public override string GetRequestUrl()
        {
            string spatialFilter;

            double disKm = SpatialTools.ConvertDistance(Distance, DistanceUnits, DistanceUnitType.Kilometers);

            if (disKm < 0.16)
            {
                disKm = 0.16;
            }

            if (disKm > 1000)
            {
                disKm = 1000;
            }

            if (Center != null)
            {
                spatialFilter = string.Format(CultureInfo.InvariantCulture, "?spatialFilter=nearby({0:0.#####},{1:0.#####},{2})", Center.Latitude, Center.Longitude, disKm);
            }
            else if (!string.IsNullOrWhiteSpace(Address))
            {
                spatialFilter = string.Format(CultureInfo.InvariantCulture, "?spatialFilter=nearby('{0}',{1})", Uri.EscapeDataString(Address), disKm);
            }
            else
            {
                throw new Exception("Location to search nearby is not specified.");
            }

            return(string.Format(base.GetBaseRequestUrl(), spatialFilter));
        }
        private static async Task <QueryResponse> MakeRequest(FindByPropertyRequest request)
        {
            var result = new QueryResponse();

            try
            {
                string urlRequest = request.GetRequestUrl();
                using (var responseStream = await ServiceHelper.GetStreamAsync(new Uri(urlRequest)))
                {
                    XDocument xmlDoc = XDocument.Load(responseStream);
                    string    name;

                    foreach (XElement element in xmlDoc.Descendants(XmlNamespaces.Atom + "entry"))
                    {
                        var r = new QueryResult()
                        {
                            EntityUrl = element.Element(XmlNamespaces.Atom + "id").Value,
                            Location  = new GeodataLocation()
                        };

                        XElement content = element.Element(XmlNamespaces.Atom + "content");

                        if (content != null && content.FirstNode != null)
                        {
                            XElement properties = (XElement)content.FirstNode;//.Element(XmlNamespaces.m + "properties");

                            if (properties != null)
                            {
                                foreach (var prop in properties.Descendants())
                                {
                                    name = prop.Name.LocalName;

                                    switch (name.ToLowerInvariant())
                                    {
                                    case "latitude":
                                        r.Location.Latitude = XmlUtilities.GetDouble(prop, 0);
                                        break;

                                    case "longitude":
                                        r.Location.Longitude = XmlUtilities.GetDouble(prop, 0);
                                        break;

                                    case "__distance":
                                        r.Distance = SpatialTools.ConvertDistance(XmlUtilities.GetDouble(prop, 0), DistanceUnitType.Kilometers, request.DistanceUnits);
                                        break;

                                    case "__IntersectedGeom":
                                        var wkt = XmlUtilities.GetString(prop);
                                        if (!string.IsNullOrEmpty(wkt))
                                        {
                                            r.IntersectedGeography = new Geography()
                                            {
                                                WellKnownText = wkt
                                            };
                                        }
                                        break;

                                    default:
                                        if (!r.Properties.ContainsKey(name))
                                        {
                                            var nVal = ParseNodeValue(prop);
                                            r.Properties.Add(name, nVal);

                                            if (nVal is Geography)
                                            {
                                                r.HasGeography = true;
                                            }
                                        }
                                        break;
                                    }
                                }
                            }
                        }

                        result.Results.Add(r);
                    }
                }
            }
            catch (Exception ex)
            {
                result.ErrorMessage = ex.Message;
            }

            return(result);
        }