NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.

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:

Ukázka funkční aplikace - Síť v C# .NET

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#

 

Předchozí článek
Geolokace podle IP adresy v C# .NET WPF - IPGeolocation
Všechny články v sekci
Síť v C# .NET
Přeskočit článek
(nedoporučujeme)
Využití API v C# .NET
Článek pro vás napsal Michal Kotek
Avatar
Uživatelské hodnocení:
11 hlasů
Autor se věnuje programování již od útlých let, aktuálně se věnuje výrobě Webových stránek jako fullstack, využívám Nette framework. Mám znalosti jazyků JS, PHP, SASS C# .NET, C++ pro Arduino. Jo a strašně rád střílím ;)
Aktivity