Lekce 2 - Geolokace podle IP adresy v C# .NET WPF - Dokončení
V minulé lekci, Geolokace podle IP adresy v C# .NET WPF - IPGeolocation, jsme zjistili veřejnou IP adresu uživatele a připravili vše potřebné pro zjištění GPS lokace podle této IP adresy.
V dnešním C# .NET WPF tutoriálu využijeme IP adresu pro určení polohy. Výsledkem budou GPS souřadnice Longitude a *Latitude *a další informace.
Budeme pokračovat v aplikaci z lekce IPGeolocation.
Zdrojový kód nugetu IPGeolocation
Pro vyhledání polohy dle IP adresy si vytvoříme novou privátní metodu
LokaceIP()
s parametrem string IPadress
.
Mezi using
příkazy přidáme nově nainstalovaný balíček
IPGeolocation
. Dále inicializujeme API nainstalovaného balíčku.
Pro inicializaci budeme potřebovat API klíč z účtu, který jsme si
založili v lekci IPGeolocation.
Instanci IPGeolocationAPI
inicializujeme jako proměnnou třídy
našeho okna:
IPGeolocationAPI api = new IPGeolocationAPI("Sem_vlozte_svuj_API_Key");
Dále pokračujeme deklarací naší metody LokaceIP()
:
private void LokaceIP(string IPadress) { GeolocationParams geoParams = new GeolocationParams(); geoParams.SetIPAddress(IPadress); geoParams.SetFields("geo,time_zone,currency");
Zde si deklarujeme instanci GeolocationParams
jako proměnnou
geoParams
, které nastavíme IP adresu. Dále upřesníme rozsah
informací, které bude metoda zjišťovat. Pro čistě zjištění GPS
souřadnic postačí zadat jen "geo"
, my využijeme celkový rozsah
možností tak, jak je deklarováno v kódu.
Následně zavoláme metodu GetGeolocation()
a její návratovou
hodnotu zpracujeme:
IPGeolocation.Geolocation geolocation = api.GetGeolocation(geoParams); // Check if geolocation lookup was successful if (geolocation.GetStatus() == 200) { City_ListV.Items.Add(geolocation.GetCity()); City_ListV.Items.Add(geolocation.GetCountryName()); City_ListV.Items.Add(geolocation.GetCurrency().GetName()); City_ListV.Items.Add("Lat: " + geolocation.GetLatitude().ToString() +"; Long: " + geolocation.GetLongitude().ToString()); }
Zde využíváme návratové hodnoty metody GetStatus()
, která
navrátí hodnotu 200
pokud se dohledání zdařilo. A využijeme
listu City_ListV
, abychom do něj vložili výsledky jako je název
města, název země, místní měnu, a to hlavní - Latitude a Longitude, tedy
GPS souřadnice, které hledáme.
Zbytek funkce řeší již jen vypsání případné chyby, pokud se vyhledání IP adresy nezdařilo, a jednoduchý textový oddělovač pro přehlednost:
else { City_ListV.Items.Add(geolocation.GetMessage()); } City_ListV.Items.Add("---------------------------------"); }
Dokončení aplikace
Zbývá pár obslužných metod v Code Behind. Tlačítku Get IP přidělíme obslužnou metodu pro zjištění IP adresy a vypsání do našeho TextBoxu:
private void IP_button_Click(object sender, RoutedEventArgs e) { IP_TBox.Text = GetIP(); }
To samé provedeme s tlačítkem Get Position:
private void Button_Click(object sender, RoutedEventArgs e) { LokaceIP(IP_TBox.Text); }
Závěr
Fungování aplikace vidíme na obrázku níže. Po kliknutí na Get IP se zjistí aktuální IP adresa. A následně po stisknutí Get position se zjistí aktuální poloha dle IP vepsané v TextBoxu:
Aplikace zjistí vaši veřejnou IP adresu a vaši polohu. Pro otestování je možné do TextBoxu vepsat jakoukoliv IP adresu a nechat si vypsat lokaci a všechny informace.
Doufám, že se vám tato demonstrace možností GeoLokace pomocí IP adresy a průvodce líbily, a že vám pomůže s implementací třeba do vašeho projektu. Já tento program napsal pro otestování předtím, než jsem jej implementoval do nejnovější verze mého projektu, zde je její volně přístupná soutěžní verze pro zajímavost.
Níže naleznete kompletní zdrojový kód ke stažení. V archivu se nachází nově i verze pro .NET Core. Zde je náhled zdrojového kódu Code Behind:
public partial class MainWindow : Window { //public string cityfromIP,lat,longt =""; IPGeolocationAPI api = new IPGeolocationAPI("YOUR_PRIVATE_ASPI_KEY"); public MainWindow() { InitializeComponent(); } private void Button_Click(object sender, RoutedEventArgs e) { LokaceIP(IP_TBox.Text); } private void LokaceIP(string IPadress) { // Get geolocation for IP address (1.1.1.1) and fields (geo, time_zone and currency) GeolocationParams geoParams = new GeolocationParams(); geoParams.SetIPAddress(IPadress); geoParams.SetFields("geo,time_zone,currency"); IPGeolocation.Geolocation geolocation = api.GetGeolocation(geoParams); // Check if geolocation lookup was successful if (geolocation.GetStatus() == 200) { City_ListV.Items.Add(geolocation.GetCity()); City_ListV.Items.Add(geolocation.GetCountryName()); City_ListV.Items.Add(geolocation.GetCurrency().GetName()); City_ListV.Items.Add("Lat: " + geolocation.GetLatitude().ToString() +"; Long: " + geolocation.GetLongitude().ToString()); } else { City_ListV.Items.Add(geolocation.GetMessage()); } City_ListV.Items.Add("---------------------------------"); } private string GetIP() { string url = "http://checkip.dyndns.org"; System.Net.WebRequest req = System.Net.WebRequest.Create(url); System.Net.WebResponse resp = req.GetResponse(); System.IO.StreamReader sr = new System.IO.StreamReader(resp.GetResponseStream()); string response = sr.ReadToEnd().Trim(); string[] a = response.Split(':'); string a2 = a[1].Substring(1); string[] a3 = a2.Split('<'); return a3[0]; } private static readonly Regex regex = new Regex("^[.0-9]+$"); // výborná pomůcka zde https://regexr.com private void IP_TBox_PreviewTextInput(object sender, TextCompositionEventArgs e) { if (!regex.IsMatch(e.Text)) //otestuje zda vstupní znak je v povoleném rozsahu e.Handled = true; base.OnPreviewTextInput(e); } private void IP_button_Click(object sender, RoutedEventArgs e) { IP_TBox.Text = GetIP(); } }
V příští lekci, Využití API v C# .NET, si vyzkoušíme zavolat API server z C# .NET a zpracovat přijatá data.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 44x (7.7 MB)
Aplikace je včetně zdrojových kódů v jazyce C#