SafeDispatch/SafeMobileLIB_DLL/ReverseGeocoding.cs

141 lines
5.0 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
namespace SafeMobileLib
{
public class ReverseGeocoding
{
private String ReverseGeoOSM = "127.0.0.1";
public ReverseGeocoding(String ReverseGeoOSM)
{
this.ReverseGeoOSM = ReverseGeoOSM;
doc = new XmlDocument();
}
private volatile XmlDocument doc = null;
private volatile XmlNode element = null;
private volatile String addr = "";
public enum Provider { OSM, GOOGLE, ANY }
public string getAddressLATLNG(Double LAT, Double LNG)
{
return getLatLngFromProvider(LAT, LNG, Provider.ANY);
}
public void getCoordinates(String address, out decimal LAT, out decimal LNG)
{
LNG = -181; LAT = -181;
try
{
doc.Load("http://maps.googleapis.com/maps/api/geocode/xml?address=" + address + "&sensor=false");
element = doc.SelectSingleNode("//GeocodeResponse/status");
if (element.InnerText == "OK")
{
element = doc.SelectSingleNode("//GeocodeResponse/result/geometry/location/lat");
LAT = Convert.ToDecimal(element.InnerText);
element = doc.SelectSingleNode("//GeocodeResponse/result/geometry/location/lng");
LNG = Convert.ToDecimal(element.InnerText);
Utils.WriteLine($"Coordinates calc from google for address {address} are [{LAT},{LNG}]");
}
else
{
Utils.WriteLine($"Unable to get coordinates from google [{address}]. Response is {element.InnerText}");
}
}
catch (Exception ex)
{
Utils.WriteLine("Unable to do coordinates calc from google");
}
}
public string getAddressLATLNG2(Double LAT, Double LNG)
{
return getLatLngFromProvider(LAT, LNG, Provider.ANY);
}
private string getLatLngFromProvider(double LAT, double LNG, Provider provider)
{
bool errorFound = false;
string address = "";
if (provider == Provider.OSM || provider == Provider.ANY)
{
Utils.WriteLine($"Doing reverse geocoding through OSM for [{LAT}:{LNG}]");
addr = "";
address = $"{ReverseGeoOSM}?format=xml&lat={(LAT.ToString()).Replace(',', '.')}&lon={(LNG.ToString()).Replace(',', '.')}&zoom=18&addressdetails=1";
try
{
doc.Load(address);
element = doc.SelectSingleNode("//reversegeocode/result");
addr = element?.InnerText.Replace("'", "`");
if (addr == null)
{
element = doc.SelectSingleNode("//reversegeocode/error");
addr = element?.InnerText.Replace("'", "`");
}
if (addr.Contains("Unable to geocode"))
{
addr = "N/A";
errorFound = true;
}
if (addr.StartsWith("Fail"))
{
addr = "N/A";
errorFound = true;
}
}
catch (Exception ex)
{
errorFound = true;
Utils.WriteLine($"Unable to do Reverse Geocoding from OSM [{LAT},{LNG}] @ {address}. Response is {ex.ToString()}");
}
}
if (provider == Provider.GOOGLE || (provider == Provider.ANY && errorFound))
{
addr = "";
try
{
doc.Load("http://maps.googleapis.com/maps/api/geocode/xml?latlng=" + (LAT.ToString()).Replace(',', '.') + "," + (LNG.ToString()).Replace(',', '.') + "&sensor=false");
element = doc.SelectSingleNode("//GeocodeResponse/status");
if (element.InnerText == "OK")
{
element = doc.SelectSingleNode("//GeocodeResponse/result/formatted_address");
addr = element.InnerText.Replace("'", "`");
Utils.WriteLine($"Reverse Geocoding [{LAT},{LNG}] is {addr}");
}
else
{
errorFound = true;
Utils.WriteLine($"Unable to do Reverse Geocoding from google [{LAT},{LNG}]. Response is {element.InnerText}");
}
}
catch (Exception ex)
{
errorFound = true;
Utils.WriteLine("Unable to do Reverse Geocoding from google");
}
}
return addr;
}
}
}