Buenas!
Si alguna vez te aburres, una actividad 100% interesante es intentar actualizar un proyecto que se ha cerrado hace 3 años o más. En mi caso, he invertido gran parte de estos últimos días en actualizar una App de Windows 8.1 a Windows 10.
He aquí un par de cosas que he aprendido
- Visual Studio 2017 es mil veces mejor que las versiones anteriores para crear UWP Apps. Este punto se aplica el dicho “para gustos colores”, en mi caso VS2017 vuela.
- Hace 3 años la opción mas recomendable para compartir código / funcionalidad entre proyectos eran Portable Class Libraries. Hoy esto es muy Old School, he migrado varios proyectos a .Net Standard y algún par de ostias he sufrido
- Por ejemplo, .Net Standard va por su versión 2.0, sin embargo, para poder crear Net Standard Class Libraries que se puedan utilizar en UWP Apps, hay que “bajar” hasta la versión 1.4
- No more CivicAddress. Si utilizas funcionalidades de localización en tu App, incluyendo valores como el país, ciudad, código postal y estado, la propiedad CivicAddress ha sido declarada obsoleta desde Win8.1
Sobre este último punto me extenderé un poco. Pues bien, cuando obtienes la ubicación en una UWP App, los 2 valores que si se retornan son latitud y longitud. Estuve investigando un poco sobre la mejor forma de obtener una dirección a partir de un punto (latitud y longitud) y llegué a esta conclusión
Puedes utilizar servicios como los siguientes donde debes tener una clave de Developer
Aunque gracias a StackOverflow encontré un servicio gratuito que con 4 líneas me resuelve el problema. Se trata de OpenStreetMap y el siguiente código es mas que suficiente para comprender como funciona
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public async Task<Tuple<string, string, string, string>> ResolveCountryAndCityNameAsync(double latitude, double longitude, string appName) | |
{ | |
var lat = latitude.ToString(CultureInfo.InvariantCulture).Replace(",", "."); | |
var lon = longitude.ToString(CultureInfo.InvariantCulture).Replace(",", "."); | |
var requestUri = $"http://nominatim.openstreetmap.org/reverse?format=xml&zoom=18&lat={lat}&lon={lon}&application={appName}"; | |
var client = new HttpClient(); | |
var resTask = client.GetStringAsync(requestUri); | |
var res = await resTask; | |
var resultDocument = XDocument.Parse(res); | |
var addressElement = resultDocument.Root.Element("addressparts"); | |
var city = addressElement.Element("city").Value; | |
var country = addressElement.Element("country").Value; | |
var postalCode = addressElement.Element("postcode").Value; | |
var state = addressElement.Element("state").Value; | |
var result = new Tuple<string, string, string, string>(country, city, postalCode, state); | |
return result; | |
} |
El resultado que retorna este servicio es similar a
Eso si, si tu aplicación requiere un uso muy intenso de este servicio, es momento de volver a Bing o a Google para evitar un
System.Net.Http.HttpRequestException: ‘Response status code does not indicate success: 429 (Too Many Requests).’
Happy Coding!
Saludos @ Toronto
El Bruno
References
- Blogs MSDN. Converting PCL (Portable Class Libraries) to .NET Standard Class Libraries
- GeoLocation CivicAddress
- OpenStreetMap
- HTTP Response 429, Too many requests