Java týden První novoroční výprodej
Hledáš brigádu v IT, která bude 100 % home office a 100 % flexibilní? Pak napiš na: redakce [zavináč] itnetwork.cz pro více info!
80 % bodů zdarma díky akci Black Friday! Tento týden rovněž sleva na e-learning Java až 80 %

Geolokace podle IP adresy v C# .NET WPF - Část 2

Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem.
Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulé části, Geolokace podle IP adresy v C# .NET WPF - Část 1, jsme si připravili vše potřebné pro naprogramování aplikace ke zjištění IP adresy a geolokace. Dnes budeme pokračovat a aplikaci dokončíme.

3. Zdrojový kód IPGeolocation

Měli bychom mít vše připravené. 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, zde budeme potřebovat API klíč z vašeho účtu, který jsme si založili v předchozí části. 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");
Naši partneři možná hledají právě tebe!

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("---------------------------------");
}

4. 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

Aplikace by měla fungovat tak jako příklad na 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:

Ukázka funkční aplikace

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();
    }
}

 

Stáhnout

Staženo 16x (7.7 MB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

 

Článek pro vás napsal Michal Kotek
Avatar
Jak se ti líbí článek?
1 hlasů
Autor se věnuje programování již od útlých let, aktuálně programuje rok v .NET framework pomocí C#.
Předchozí článek
Geolokace podle IP adresy v C# .NET WPF - Část 1
Všechny články v sekci
C# - Pro pokročilé
Miniatura
Následující článek
Průhledné okno s Aero Glass efektem v C# .NET WPF - Část 1
Aktivity (3)

 

 

Komentáře

Avatar
Vakos
Redaktor
Avatar
Vakos:12.11.2019 23:09

Pěkný článek, jen škoda že nebyl využit nějaký návrhový vzor. Nejlépe tahat data pomocí binding atd. U větších projektů by tento přístup (použitý v článku) by úplně ideální nebyl, všechno v sobě, takže horší na udržování atd.

Odpovědět
12.11.2019 23:09
"Jediný způsob, jak dělat skvělou práci, je milovat to, co děláte. Pokud jste to ještě nenašli, hledejte dál. Ne...
Naši partneři možná hledají právě tebe!
Avatar
Michal Kotek
Redaktor
Avatar
Odpovídá na Vakos
Michal Kotek:13.11.2019 8:22

Díky, jasne ze by to slo udělat komplexnější, ale slo o ukázku toho jak to zprovoznit a jak s tim pracovat. Nicméně klidně vem zdrojak a uprav ho a nahod ho sem, upravit to je uz vicemene banalitka...

Odpovědět
13.11.2019 8:22
Give a man a fish and you feed him for a day; teach a man to fish and you feed him for a lifetime.Teach a man to code...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.