Gdybyśmy potrzebowali na naszej witrynie wyświetlić mapę za pomocą API Googla czy też Bing przeważnie z tym nie ma problemu, do póki nasza strona/aplikacja jest darmowa. Jeżeli już chcielibyśmy stworzyć wersję komercyjną musimy rozbić się o licencje (które naprawdę nie są tanie).

W takim wypadku jesteśmy przeważnie skazani albo na rastrowe rozwiązanie – czy to obrazek JPG czy też kształy Shape. Tak czy siak rozwiązanie takie niesie kolejne wyzwania i niepotrzebny nakład pracy – trzeba odzwierdźiedlić nasz obrazek na odpowiedniej sferze (zrobić odpowiednie przekształcenia), dodać obliczenia położenia geograficznego do pixel itp. itd.

Ogólnie pracy jest masa i nie ma gwarancji, że nam się to naprawdę uda.

Na szczęście pewna grupa ludzi utworzyła swojego czasu projekt o nazwie Open Street Map, który udostępnia mapę całego świata za darmo nawet do komercyjnego wykorzystania. Zaś dostęp do niej możemy mieć chociażby poprzez JavaScript API OpenLayers (przkłady) czy też przez kontrolkę .NET (tak, tak :)) dostępną na stronach CodePlex.

Na przykład by w OpenLayers zaznaczyć element na mapie (za pomocą obrazka dostępnego loklanie lub poprzez sieć), wystarczy wykonać taki kod (zakładam, że mamy już obiekt mapy):

var lat = 52.1480807;
var lon = 21.0866336;

var layerMarkers = new OpenLayers.Layer.Markers("Markers");
map.addLayer(layerMarkers);

var lonLat = new OpenLayers.LonLat(lon, lat).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());
map.setCenter(lonLat, 16);

var size = new OpenLayers.Size(21, 25);
var offset = new OpenLayers.Pixel(-(size.w / 2), -size.h);
var icon = new OpenLayers.Icon('http://www.openstreetmap.org/openlayers/img/marker.png', size, offset);
layerMarkers.addMarker(new OpenLayers.Marker(lonLat, icon));

Zaś w przypadku kontrolki .NET mamy trochę więcej możliwości, w szczególności dla WPFa, by wykonać to samo zakładamy, że istnieje user control z obrazkiem i nazywa się MyCustomMarker:

PointLatLng latLong = new PointLatLng(52.1480807, 21.0666336);

GMapMarker it = new GMapMarker(latLong);
it.ZIndex = 55;
it.Shape = new MyCustomMarker(it);
            
MainMap.Markers.Add(it);

Nagle cały problem komercyjnego wykorzystania map Googla i Bing przestaje być istotny :) Muszę powiedzieć, że na szczęście :)

PS.: Oczywiście takich bajerów jak poniżej nie znajdziemy… ale może kiedyś ktoś to doda do otwartych map :)