Kezdőlap > .NET, Windows Phone 7 > Útvonaltervezés

Útvonaltervezés

2012. április 9. hétfő Hozzászólás Go to comments

A térképen kívül egyéb hasznos szolgáltatást is kínál számunkra a Microsoft, ezeket a funkciókat szabványos web szolgáltatáson keresztül érhetjük el.

Geocode Service – Címek, nevezetes helyek, földrajzi nevek keresése, koordinátákká alakítása vagy koordináták alapján ezek kinyerése.

http://dev.virtualearth.net/webservices/v1/geocodeservice/geocodeservice.svc

Route Service – Útvonalak tervezése az általunk megadott köztes pontok között, azaz nem csupán kezdő- és végpontot adhatunk meg, hanem érintett pozíciók egész listáját. Ezen a listán a tervező algoritmus sorban végigmegy, majd ezt a gráfot bejáró ponthalmazt ad vissza nekünk. Lehetőségünk van az utazás módjának beállítására (gyalog / autóval), valamint meghatározhatjuk, hogy milyen szempontból keressen optimális eredményt (sebesség, távolság, sőt akár a forgalmi helyzettel való számolást is kérhetjük).

http://dev.virtualearth.net/webservices/v1/routeservice/routeservice.svc

Search Service – Nevezetes helyek, például éttermek, mozik keresése – ez pozícióhoz is köthető.

http://dev.virtualearth.net/webservices/v1/searchservice/searchservice.svc

Nézzünk az útvonaltervezésre egy példát!

1. Készítsünk egy új Windows Phone 7 alkalmazást!

2. A felhasználói felületre dobjunk fel egy gombot, a gomb neve legyen a btnRoute, a Content-je az „Útvonaltervezés” legyen!

3. A felhasználói felületre dobjunk fel egy Map vezérlőt (ha feldobjuk a megfelelő névteret automatikusan betölti). Állitsuk be a CredentialsProvider-nél az API key-ünket, a Centert-t és a Zoom Level szintet! A Map-re dobjunk fel még két PushPin-t, ezenkívül lesz egy MapPolyLine is, ez fogja reprezentálni majd az útvonalat.

A XAML a következőképpen fog kinézni:

<my:Map Margin="0,70,12,6" Name="map1"

    CredentialsProvider="AnY59ktyRJ-7g…"

    Center="47.4753, 019.0552"

    ZoomLevel="15"

    ZoomBarVisibility="Visible"

    CopyrightVisibility="Collapsed"

    LogoVisibility="Collapsed">

        <my:MapPolyline Name="lRoute" Stroke="Red" Opacity="0.7" StrokeThickness="8" />

        <my:Pushpin Location="47.4746, 019.0498" Content="Allee Bevásárlóközpont" />

 <my:Pushpin Location="47.4683, 019.0522" Content="Evosoft Hungary Kft." />

</my:Map>

<Button Content="Útvonal tervezés" Height="72" HorizontalAlignment="Left" Name="btnRoute" VerticalAlignment="Top" Width="243" Click="btnRoute_Click" />

4. Kattintsunk kétszer az útvonal tervezése gombra, ekkor betöltődik a kódnézet.

5. Kattintsunk a Solution Explorer-ben a References-re jobb egérgombbal, és válasszuk ki az Add Service Reference… menüpontot!

image

6. A megjelenő ablakban adjuk meg az útvonaltervező szolgáltatás címét, majd kattintsunk a Go gombra! Ebben a pillanatban megpróbálja megtalálni a szolgáltatást. A Namespace neve legyen például RouteSzolg!

image

7. Oldjuk fel ennek a szolgáltatásnak a névterét, valamint további névtereket is:

using [PROJECTNEVE].RouteSzolg;

using Microsoft.Phone.Controls.Maps;

using System.Collections.ObjectModel;

using System.Device.Location;

8. Készítsünk egy változót- a Credentials változót- és ehhez egy megfelelő tulajdonságot (Ezt a konstruktor elé helyezzük most)!

private const string apkiKey = "AnY59ktyRJ-7g-…";

private readonly Credentials cred = new Credentials

{

    ApplicationId = apkiKey

};

9. A btnReoute klikk eseményének törzsében először példányosítjuk a RouteServiceClient-et:

RouteServiceClient rc = new RouteServiceClient();

10. Ahhoz, hogy útvonalat tervezzünk, meg kell hívnunk a CalculateRoute metódust, ami egy RouteRequest példányt igényel, ezt viszont fel kell paramétereznünk. A RouteServiceClient példányosítása után példányosítsuk a RouteOptions nevezetű osztályt. Itt meghatározzuk, hogy a pontok listáját hogyan kapjuk vissza: az útvonal gyors legyen, vegye-e figyelembe a forgalmi adatokat, valamint hogy gyalog vagy autóval tervezze az útvonalat. Ebben az esetben a következőképpen példányosítjuk a RouteOptions-t:

RouteOptions options = new RouteOptions()

{

    RoutePathType = RoutePathType.Points,

    Optimization = RouteOptimization.MinimizeTime,

    TrafficUsage = TrafficUsage.TrafficBasedTime,

    Mode = TravelMode.Driving

};

11. Most adjuk meg a kiindulási és a végpontot! Ez egy Waypoint lista lesz:

ObservableCollection<Waypoint> points = new ObservableCollection<Waypoint>()

{

    new Waypoint

    {

        Location = new GeoCoordinate(47.4746, 019.0498)

    },

    new Waypoint

    {

        Location = new GeoCoordinate(47.4683, 019.0522)

    }

};

12. Most már megvannak a kezdő- és a végpont, valamint az útvonaltervezési beállítások is. Itt az ideje elkészíteni a RouteRequest példányt. Ennek meg kell adnunk a RouteOptions-t, Waypoints gyűjtemény (kezdő- és végpont), valamint a Credentials-t (Application Key):

RouteRequest request = new RouteRequest()

{

    Credentials = cred,

    Options = options,

    Waypoints = points

};

13. Nincs más hátra, mint meghívni a szolgáltatást, és feliratkozni a Completed eseményre. Először iratkozzunk fel a CalculateRouteCompleted eseményre:

rc.CalculateRouteCompleted += new EventHandler<CalculateRouteCompletedEventArgs>(rc_CalculateRouteCompleted);

14. Ezt követően hívjuk meg a szolgáltatást, és adjuk át számára a RouteRequest példányt!

rc.CalculateRouteAsync(request);

15. Most már csak az eredmény kirajzolása van hátra. Írjuk meg a Completed esemény törzsét:

void rc_CalculateRouteCompleted(object sender, CalculateRouteCompletedEventArgs e)

{

    LocationCollection lCollection = new LocationCollection();

    foreach (var item in e.Result.Result.RoutePath.Points)

    {

        lCollection.Add(item);

    }

    lRoute.Locations = lCollection;

    // pozícionáljuk a térképet az útvonalra!

    map1.SetView(e.Result.Result.Summary.BoundingRectangle);

}

16. Elkészült az alkalmazásunk, indítsuk el, és próbáljuk ki működés közben!

17. Amikor elindul az alkalmazás, két POI pontot látunk a térképen. Ha rákattintunk az Útvonal tervezése gombra, akkor egy webszolgáltatás kérést indítunk. Amint megérkezik a válasz, megkapjuk az ideális útvonalat a két pont között.

Az eredmény képekben:

image

Reklámok
Kategóriák:.NET, Windows Phone 7 Címke: , ,
  1. 2012. november 22. csütörtök - 19:42

    Kedves Attila!
    A következő problémába akadtam egy fejlesztés közben. Az általad írt kódgyűjteményben az útvonalkeresésnél azt szeretném csinálni, hogy a telefon GPS pozícióját lekérdezem, majd elhelyezek két pushpint a térképre. Az egyik a GPS-ből kapott Location a másikat
    pedig egy adatbázisból megkapott koordináta. Amint a telefon pozíciója változik a telefont jelző pushpint az új helyre tenném, hogy lássa a felhasználó hogy épp hol jár. Egy gombot lenyomva a “map1.Children.Add()” metódussal hozzáadom a két pushpint, majd erre a két koordinátára hívok egy útvonalkeresést az gond nélkül lefut szépen kirajzolja a két pont között az útvonalat. Azonban amikor a telefonnal pozíciót váltok, majd az először hozzáadott map1.Children[0] = pushpinphonepoz sorral felülírnám az először berakott pushpint az új koordinátákkal, akkor az megjelenik az új pozícióban, azonban az útvonalkeresés eredménye nem látható. Tehát nincs útvonal a két koordináta között, habár maga a metódus tökéletesen lefut és még újrapozicionálja a térképet is az új útnak megfelelően. Próbálkoztam több megoldással is pl map1 = new Map (), map1.children.Clear() stb… azonban úgy tűnik, hogyha belenyúlunk valamilyen módon a map1-be akkor az onnantól kezdve nem hajlandó magát az útvonalat kirajzolni. Ha erre lenne valamilyen megoldásod azt nagyon szépen köszönöm.

  1. No trackbacks yet.

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s

%d blogger ezt kedveli: