Im ersten Teil habe ich eine groben Überblick über das Projekt gegeben.

Im zweiten Schritt haben wir Windows Azure Cloud Services einbezogen.

Im dritten Teil haben wir angeschaut, was uns OData und WCF Data Services und das Entity Framework 4 (EF4) bringen können.

Im vierten Teil haben wir mit einer ASP.NET MVC Seite die OData-Daten als Webservice aufgerufen und als kleine Fotos auf eine Bing Map gezeichnet.

Im fünften Teil werden haben wir mit  AJAX CRUD Operationen gegen unseren Azure OData Service ausgeführt.

Jetzt wollen wir zeigen, wie wir in der Datenbank Entfernungen zwischen den Kollegen berechnen können!

Dazu verwenden wir eine Tabelle mit einer Spalte vom Typ “geography”:

image

In diesem Feld können wir eine Positions-Infomation (einen Punkt) speichern, die sich jeweils aus der Latitude und Longitude Information zusammensetzt. Dieser Datentyp wird binär gespeichert, deshalb habe ich zur Verdeutlichung noch das Feld GeoPoint als Varchar(255) angelegt, das eine textuelle Entsprechung des Wertes enthält.

Beispiel:

GeoLocation   und  GeoPoint:
0xE6100000010CA31FB98C53B7474091976E726B1F2140    POINT(9.552612304687494 49.01265386395501)
0xE6100000010CC0791DC832B7474004000060E81E2140    POINT(8.562847139546658, 47.45562644775183)

Woher kommen die Werte ?

Wir lassen das Bing Maps Control diese Arbeit erledigen. Vom Control bekommen wir eine genaue Geo-Position eines Punktes auf der Karte. Wir erreichen das, indem wir das  Klick-Event abfangen und die Position auslesen (siehe Teil 4) .

Die beiden Dezimal-Werte bauen wir zu einen String zusammen, mit dem oben gezeigten Format.

Diesen Punkt müssen wir jetzt noch in einen geography Wert umwandeln, das geht am besten über eine Trigger auf der TVDLunch Tabelle:

CREATE TRIGGER [dbo].[TVDLunch_Ins_Upd] 
   ON  [dbo].[TVDLunch] 
   AFTER INSERT,UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    Update dbo.TVDLunch
    set geoLocation = geography::STGeomFromText(coalesce(i.GeoPoint,t.GeoPoint), 4326)
    from dbo.TVDLunch t inner join inserted as i
    on t.id = i.Id;
     

END

Hier sehen wir jetzt die Spatial-Funktionen von SQL Server im Einsatz. Die Funktion geography::STGeomFromText wandelt unseren String im Feld GeoPoint in einen geography Wert um!

So können wir jetzt auch weitere Spatial-Funktionen verwenden, um die Distanz zwischen den Kollegen auszurechnen. Dafür habe ich eine Stored Procedure erstellt, die alle Kollegen in der Nähe eines einzelnen Kollegen auflistet:

CREATE PROCEDURE [dbo].[FindColleguesNearMe]
    @NickName Varchar(50) , 
    @HowFar bigint = 10000
AS
BEGIN
    SET NOCOUNT ON;

    Declare @Center geography;
    Select @center = GeoLocation from dbo.TVDLunch where Nickname = @NickName;
    
     

select  @center.STDistance(a.geoLocation) as Distance, 
a.Nickname, a.LunchTime, a.LocationText, 
a.GeoLocation.STAsText() as geoPoint
from dbo.TVDLunch a 
where @center.STDistance(a.geoLocation) <= @HowFar
and Nickname <> @NickName

END

Diese SP selektiert alle hungrigen Kollegen in der Nähe, im Umkreis von 10000 Metern, falls nichts anderes als Distanz übergeben wurde.

Hierzu verwenden wir die Spatial-Funktion STDistance(a.geoLocation), die direkt vom Datentyp geography bereitgestellt wird.

Die Stored Procedure wird im OData Web-Service veröffentlicht, so das der Ajax-Client (und alle anderen Odata Clients) diese komfortabel aufrufen kann.

So können wir die Positionen “live” im Browser anzeigen, z. B. wenn der Anwender seine eigene Position verändert.

Der Mitarbeiter kann dann direkt mit seinen Kollegen in der Nähe Kontakt aufnehmen und braucht nicht alleine zu essen!

Mission accomplished!

image

hier noch der Code für den ADO.NET Data Service:

[WebGet]
        public IQueryable<ColleguesNearMe> FindColleguesNearMe(string nickName, string howFar)
        {
            return this.CurrentDataSource.FindColleguesNearMe(nickName, long.Parse(howFar)).AsQueryable();
          
        }

jetzt haben wir alle Bausteine zusammen, um eine Location-based Cloud-Applikation zu bauen.

Als nächstes wollen wir das Frontend auf dem Windows Phone 7 programmieren.

Hier wird uns wieder das Bing Map Control helfen, diesmal als Silverlight Ausfühung.

Die Geo-Location Information des Anwenders bekommen wir direkt von Telefon, das mit seinem GPS Sensor eine sehr genaue Ortsbestimmung erlaubt.