public static async Task<GeoTagsEntry> LocateAsync([CanBeNull] string address) {
var requestUri = string.Format(RequestLocationUri, HttpUtility.UrlEncode(CleanUpRegex.Replace(address ?? "", " ")));
using (var order = KillerOrder.Create(new WebClient(), 5000)) {
var data = await order.Victim.DownloadStringTaskAsync(requestUri);
var ns = XNamespace.Get(@"http://where.yahooapis.com/v1/schema.rng");
var centroid = XDocument.Parse(data).Descendants(ns + @"centroid").FirstOrDefault();
var latitude = centroid?.Element(ns + @"latitude");
var longitude = centroid?.Element(ns + @"longitude");
if (latitude == null || longitude == null) throw new Exception("Invalid response");
return new GeoTagsEntry(FlexibleParser.ParseDouble(latitude.Value),
FlexibleParser.ParseDouble(longitude.Value));
}
}
}