Im aktuellen .NET Magazin ist ein schöner Bericht von Tobias Richling über das Entwickeln von Webanwendungen die geographische Daten per Bing Maps visualisieren.
Dabei benutzt er ein Bing Maps ASP.NET Control, das auf Codeplex veröffentlicht wurde.
Nachdem ich den Artikel durchgelesen habe, dachte ich mir: “Hey, Sharepoint mit Bing Maps ausstatten … wieso nicht?”
Das Ergebnis lies nicht lange auf sich warten. Deshalb möchte ich hier zeigen wie man Bing Maps per Webpart in den Sharepoint 2010 einbinden kann.

Bing Maps im Sharepoint 2010
Bing Maps ASP.NET Control anpassen
Das Bing Maps ASP.NET Control ist ein Wrapper, der um den Bing Maps Service gelegt wurde. Das Steuerelement gehörte zum Live SDK wurde aber wieder entfernt.
Der Vorteil dieses Steuerelements ist, dass man durch das Setzen von wenigen Eigenschaften eine Bing Map angezeigt bekommt ohne eine Zeile Javascript. Dennoch ist es möglich die angezeigte Karte mittels Bing Maps AJAX SDK zu ändern, was einem Entwickler bei Sharepoint 2010 Projekten sehr entgegen kommt
.
Auf Codeplex steht nur der Quellcode des Steuerelements zu Verfügung. Da die Assembly, um sie in Sharepoint benutzen zu können, mit einem Schlüssel signiert sein muss , ist das sogar ein Vorteil.
Wenn man sich den Quellcode geladen hat, kann man die Solution in Visual Studio öffnen und die Assembly signieren. Das Projekt das einen Schlüssel braucht hat den Namen Microsoft.Live.ServerControls.VE.
Ist dieser Schritt erledigt kann man das Projekt neu erstellen. Das benötigte Steuerelement findet man dann im Projektordner unter Sourcebin.
Erstellen eines Bing Map Webparts
Um das Bing Maps Webpart zu erstellen, benutzt man am besten die Vorlage für ein normales Webpart (die Vorlage des Visual Webpart finde ich ein wenig oversized).
Nachdem man die Referenz zur Bing Maps Control hinzugefügt hat, muss man im Solution Packet Editor noch die Assembly als SafeControl eintragen, damit sie mit auf den Server deployt wird.
Das Solution Paket sollte danach so aussehen:
<Solution xmlns="http://schemas.microsoft.com/sharepoint/" SolutionId="3dd182a9-21c3-4260-9177-de19e39420fe" SharePointProductVersion="14.0">
<Assemblies>
<Assembly Location="Microsoft.Live.ServerControls.VE.dll" DeploymentTarget="GlobalAssemblyCache">
<SafeControls>
<SafeControl Assembly="Microsoft.Live.ServerControls.VE, Version=0.1.0.0, Culture=neutral, PublicKeyToken=null" Namespace="Microsoft.Live.ServerControls.VE" TypeName="*" />
<SafeControl Assembly="Microsoft.Live.ServerControls.VE, Version=0.1.0.0, Culture=neutral, PublicKeyToken=null" Namespace="Microsoft.Live.ServerControls.VE.Extenders" TypeName="*" />
</SafeControls>
</Assembly>
<Assembly Location="BingMapsWebpart_SP2010.dll" DeploymentTarget="GlobalAssemblyCache">
<SafeControls>
<SafeControl Assembly="BingMapsWebpart_SP2010, Version=1.0.0.0, Culture=neutral, PublicKeyToken=2cf157c772a0dd57" Namespace="BingMapsWebpart_SP2010.BingMaps" TypeName="*" />
</SafeControls>
</Assembly>
</Assemblies>
<FeatureManifests>
<FeatureManifest Location="BingMapsWebpart_SP2010_BingMapsFeatureFeature.xml" />
</FeatureManifests>
</Solution>
Je nachdem wie man das Webpart benutzen möchte muss man noch die Deployment Eigenschaften anpassen.
Für mein Beispiel benutze ich folgende Einstellungen:
- Deployment der Assemblies im GAC
- Webpart Feature Bereich Site
Zurück zum eigentlichen Thema.
Im Quellcode des Webparts muss man erst einmal feststellen ob ein ScriptManager auf der Seite vorhanden ist, da es sich beim Bing Maps ASP.NET Control um ein Ajax Control handelt. Ist kein ScriptManager auf der Seite vorhanden muss man einen hinzufügen! Am besten Überschreibt man dafür die Methode OnInit( ).
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
// enables script manager
ScriptManager sm = ScriptManager.GetCurrent(this.Page);
if (sm == null)
{
// register scriptmanager
ScriptManager newScriptManager = new ScriptManager() { ID = "bingMapsScriptManager", ScriptMode = ScriptMode.Auto };
this.Page.Form.Controls.Add(newScriptManager);
}
}
Fehlt nur noch eine Bing Map. Um diese anzeigen zu lassen erstellt man in der Methode CreateChildControls( ) das Objekt Map. Das Map-Objekt ist das Hauptobjekt das benötigt wird und befindet sich im Namespace Microsoft.Live.ServerControls.VE. Es spiegelt wie der Name schon vermuten lässt eine Bing Map wieder.
Man könnte sich die Map jetzt schon anzeigen lassen. Aber ich möchte den Benutzer gerne auf eine Standardansicht leiten. So kann man mittels der Eigenschaft Dashboard das Bing Maps Menü ein- bzw. ausblenden und die Eigenschaft Center gibt an welchen Punkt das Map-Objekt zu Beginn zentrieren soll.
Dazu gibt es noch viele weitere Eigenschaften auf die ich hier nicht weiter eingehen möchte, da es sehr viele sind.
Der Code um Berlin in der Karte anzeigen zu lassen sieht folgendermaßen aus:
protected override void CreateChildControls()
{
base.CreateChildControls();
Map bingMap = new Map() { ID = "bingMap", Height = new Unit(600), Width = new Unit(100.00, UnitType.Percentage) };
bingMap.ZoomLevel = 10;
bingMap.Dashboard = true;
bingMap.Center = new LatLong(52.5070, 13.3615); // Berlin
bingMap.Locale = SupportedLocales.de_de; // UI in deutsch
bingMap.ScaleBarDistanceUnit = DistanceUnit.Kilometers; // Maßeinheit in KM
this.Controls.Add(bingMap);
}
Jetzt kann man das Webpart testen. Einfach das Debuggen starten und das Bing Map Webpart auf einer Seite hinzufügen.
Daten in Bing Map anzeigen
Natürlich kann man sich mit Bing Maps nicht nur eine Karte anzeigen lassen. Wie auch bei vielen anderen Web Map Diensten kann man Punkte auf der Karte hervorheben. Dazu gehören z.B. Punkte auf Objekte, Routen, hervorgehobene Bereiche.
Ermöglicht wird das Ganze im Bing Maps ASP.NET Control durch Shapes. Wenn ich mir also eine Reißzwecke am Brandenburger Tor hinzufügen möchte muss ich ein Shape in Gestalt einer Reißzwecke hinzufügen.
Shape brandenburgerTor = new Shape(ShapeType.Pushpin, new LatLongWithAltitude(52.51625, 13.37767));
brandenburgerTor.Title = "Brandenburger Tor";
brandenburgerTor.Description = "Das Wahrzeichen Berlins";
brandenburgerTor.MoreInfoURL = "http://de.wikipedia.org/wiki/Brandenburger_Tor";
bingMap.AddShape(brandenburgerTor);
Die wichtigesten Informationen muss man im Konstruktor übergeben. ShapeType.Pushpin gibt an, dass der Shape als Reißzwecke gerendert wird. Danach folgen die Koordinaten für das Brandenburger Tor als LatLongWithAltitude-Objekt.
Die Eigenschaften Title, Description und MoreInfoURL geben an was angezeigt werden soll, wenn man mit der Maus über den Reißzwecken fährt.

Ortsmarke in Bing Maps
Fazit
Durch Bing Maps und das Bing Maps ASP.NET Control ist es auf einfache Art und Weise möglich geographische Daten im Sharepoint zu visualieren. Man könnte sich beispielsweise eine Liste mit Konferenzen halten und speichert sich in einem zusätzlichen Feld wo sie statt finden. Für mich ist es zudem eine Abwechslung zu den einfach gehaltenen Listen.
Ob Bing Maps in ASP.NET / Sharepoint Anwendungen eine Zukunft hat wird sich noch zeigen. Mir hat das Entwickeln dieser Beispielapplikation auf jeden fall Spaß gemacht.
BingMapsWebpart_SP2010.zip