Die Einbindung der Offline Karten des OpenStreetMap Projektes hat erfolgreich funktioniert. Ich hatte etwas Probleme mit der Erstellung der SQL Datenbank, aus der die einzelnen Tiles geladen werden, aber nachdem ich den Zoomfaktor der per Perl Skript runtergeladenen Tiles auf 1 bis 16 gesetzt habe und im Testmodul als Startkoordinaten die präzisen Breiten- und Längengraden angegeben habe, klappt’s nun auch endlich. 😀 Allerdings bläht das Kartenmaterial die App auch ganz schön auf. Alleine die Karten sind schon knapp 40MB groß, dabei habe ich mich auf die gerade noch sinnvolle maximale Detailstufe von 16 beschränkt.
Screenshot_myFirstAppEine Stufe höher (17) wäre mir noch lieber gewesen, aber dann wäre das Kartenmaterial ca. 100MB groß geworden. Vielleicht etwas für ein späteres Update, je nachdem wie die Resonanz dazu aussehen wird. Eine Möglichkeit wäre noch, es dem Anwender zu überlassen, ob er alternativ die Google (online) Maps nutzen möchte. Für die deutsche Nutzerschaft wäre das zumindest eine gute Sache, die ich eventuell noch umsetzen werde bei einem weiteren Update. Im Screenshot zu diesem Artikel seht ihr dann nun auch einen ersten Entwurf der eigentlichen Oberfläche meiner ersten iPhone App. Bei dieser Gelegenheit sei erwähnt, dass so ein TabBarController zickig sein kann! 😉 Viel mehr gekämpft habe ich aber (und nun wird es etwas technisch), mit der Begrenzung der Karte. Da es sich wie gesagt um lokal gespeicherte Offline Karten von Wuppertal handelt, gelangt man beim Verschieben der Karte abseits von Wuppertal in graues Niemandsland. Im Standard ist die route-me Library zwar in der Lage, den User auf eine bestimmte Zoom Stufe zu begrenzen, aber leider nicht das Bewegen auf der Karte einzuschränken. Im Entwickler Wiki habe ich Aussagen gefunden, dass die Macher von route-me das schon einmal umgesetzt haben, es aber nicht in Produktion übernommen haben, da es zuviele Probleme damit gab. Also habe ich mich selbst ans Patchen der Library gemacht und einen zwar nicht gerade super schönen, aber funktionalen Weg gefunden, um zu verhindern, dass der Nutzer der App den Kartenbereich verlässt. Dazu habe ich im route-me Framework die Datei MapView/Map/RMMapContents.m gepatcht und die Methode moveBy wie folgt um „Bounds“ erweitert:

– (void)moveBy: (CGSize) delta
{
[mercatorToScreenProjection moveScreenBy:delta];
[imagesOnScreen moveBy:delta];
[tileLoader moveBy:delta];
[overlay moveBy:delta];
[overlay correctPositionOfAllSublayers];
[renderer setNeedsDisplay];

//AZe: Grenzen setzen für Map Scrolling (Wuppertal)
const float AZeMinLat = 51.2;
const float AZeMaxLat = 51.298;
const float AZeMinLon = 7.05;
const float AZeMaxLon = 7.31;


CLLocationCoordinate2D AZeCoordinate;
AZeCoordinate.latitude = self.mapCenter.latitude;
AZeCoordinate.longitude = self.mapCenter.longitude;
if ( AZeCoordinate.latitude > AZeMaxLat ||
AZeCoordinate.latitude < AZeMinLat ||
AZeCoordinate.longitude > AZeMaxLon ||
AZeCoordinate.longitude < AZeMinLon )
{
if ( AZeCoordinate.latitude > AZeMaxLat ) {
AZeCoordinate.latitude = AZeMaxLat;
}
if ( AZeCoordinate.latitude < AZeMinLat ) {
AZeCoordinate.latitude = AZeMinLat;
}
if ( AZeCoordinate.longitude > AZeMaxLon ) {
AZeCoordinate.longitude = AZeMaxLon;
}
if ( AZeCoordinate.longitude < AZeMinLon ) {
AZeCoordinate.longitude = AZeMinLon;
}
[self setMapCenter:AZeCoordinate];
}

}

Der Effekt dieses Patches ist, dass der Anwender zwar die Map weiterziehen kann, sie aber auf die Grenzen zurückspringt. Die Koordinaten beziehen sich auf die Mitte der Map, wodurch sich bei unterschiedlichen Zoom Tiefen auch leicht unterschiedliche Grenzen ergeben. Wie gesagt, nicht schön, aber funktionell und dadurch dass die Map ohnehin nur für Wuppertal Interessierte gedacht und großzügig bemessen ist, dürften die meisten Anwender das nie bemerken.