How to use custom offline map in iOS app - ios

I'm developing an iPhone offline map application. I've illustrator map georeferenced (using mapublisher), have geodatabase (http://goo.gl/isw6IP) and parking data (shp/csv).
Requirements:
The map should Pan, Pinch & zoom.
Search addresses and parking (addresses have alternate names too) on map.
Routing/Navigate to parking/address.
GPS Positioning.
App will work offline without internet connection once installed.
Questions:
In which formate I should export the illustrator map, geodatabase & parking data to be used in a iOS app.
Which iOS offline maps SDK is recommened for above requirements.
Few iOS SDKs like Route-ME, MapBox, Alpstein, Altus, Skobbler, cloudmade, ArcGis iOS SDK, nutiteq etc are using OSM data or their own hosted MAP data but I want to use my own illustrator map and all data will be available local for offline use.
I've search alot but could not find any concreat solution. Few links in my research.
http://goo.gl/m9Lp1w
http://goo.gl/IMKF4p
http://goo.gl/gsrv5Q
http://goo.gl/J4Ne5y
https://goo.gl/1wP29H
Same question (similar to what I need) was asked long time ago but without any answer
http://goo.gl/knoA1C

1:
In my opinion, OpenStreetMap is the best one for all-around purposes such as the ones you mentionned: addresses, parkings, routing, maps.
You can answer all requirements with that format. Depending on your project, you may better transform your data in a specific format for each requirement.
2:
You'll probably have to use a few components to match all requirements :
The map should Pan, Pinch & zoom.
Any of the SDK listed will do it.
Search addresses and parking (addresses have alternate names too) on map.
You can query a local database then create markers.
Routing/Navigate to parking/address.
I would recommend GraphHopper
GPS Positioning.
It can be done manually using CLLocationManager. Create a marker (according to the chosen SDK) then update it's coordinates.
App will work offline without internet connection once installed.
That's the main requirement. You have to chose between vector and raster first, then pick the SDK. You'll probably have to make a few transformation here.

Related

Offline Map for Private Property with Navigation in iOS

I have an idea of building offline Map for my University Campus (its covering almost 3-4 miles). Like new students or guests can navigate to various blocks in campus. Student can see himself/herself marked on map at current location & can chose destination from pre-defined list of places and application will navigate them.
I have explored alot like maptiles can help me in showing maps. But is there any other efficient way of showing campus map ? And I have no idea how will I navigate user (since being a private property area is out of reach of Google's Maps (or some other) API).
Any suggestions will be helpful. :)
EDITED
Here is Google Map link to my place.
I am studying ArcGIS from last few days, learned to create its 'geodatabase' using 'ArcGIS for Desktop' for rendering offline maps on iPhone.
However, now my concern is how to Navigate user.
And I will welcome any suggestion/idea for accomplishing it using any different approach.
You can achieve that with MapBox.
MapBox is an alternative to GoogleMaps and supports offline maps.
Mapbox iOS SDK
There are three methods available to the Mapbox iOS SDK
for offline maps. With cache-based methods, the RMTileCache for an
RMMapView can be configured to keep map tiles around based on their
count or based on their age in the cache.
Caching based on previous user interaction
Tiles are automatically cached once they are downloaded for display
based on the user’s panning and zooming of the map. For example, if a
user views the map, then zooms out, then zooms back in later when
offline, the original tiles will be present in cache and will display
without need for a network connection.
Proactive background caching for certain map regions
Using RMTileCache and the RMTileCacheBackgroundDelegate protocol, the
developer can enable the user to download a certain bounding box and
zoom range in the background in advance of actually displaying them on
screen. Callbacks trigger, allowing the developer to report progress
to the user or even to cancel a download in progress.
Tiles that already exist in cache will be skipped over during this
background download instead of re-downloaded.
MBTiles prepackaged tiles
Using the MBTiles format for map tile storage, developers can build
apps that read the tiles straight out of the MBTiles file and do not
ever need a network connection. Since MBTiles is an open format, files
can be created manually or with TileMill, as well as many other
applications and utilities such as mbutil.
You need the last one (i.e. MBTiles prepackaged tiles).
Source: https://www.mapbox.com/help/ios-offline/
If you go the OpenStreetMap way (map your property directly in OpenStreeMap) then you can also use the Scout SDK.
It's OSM based and provides full support for offline maps, offline routing & TBT navigation. If you properly connect the road segments then the SDK will be able to create car, bike & pedestrian routes on your data.
While not free, the Scout SDK has a free tier that might be large enough for your particular needs (if not you'll move to a "pay-as-you" model)

Real time vector-based OSM renderer in iOS (using OpenGL ES)

I'm looking into a solution that will allow to use OpenStreetMap data to render a 2D top-view vector-based map in iOS, instead of using pre-rendered tiles from a server. Similar to Apple and Google Maps in iOS6+.
I've done extensive research on this matter, but didn't found too much information.
There are a number of iOS apps that do this, but no information on how they implement it. A couple of these apps are:
ForeverMap 2 by skobbler
Galileo Offline Maps
OffMaps 2
The first 2 apps work similar to Apple and Google Maps. The map is drawn in real time whenever the zoom changes.
The last one appears to be using a slightly different approach. It renders the vector data at specific zoom levels and creates tiles which are then used as normal tiles downloaded from a tile server. So the rendering engine could actually be a tile source for the Route-Me library, but instead of downloading the tiles it renders them on the fly.
The first method is preferred.
[Q] I guess one could switch between methods fairly easy, once the OpenGL ES renderer is in place. I mean you could use the renderer as a source for Route-Me to create tiles, or you could use it as a real-time drawer, similar to a game. Am I right?
The closest solution I found is OpenStreetPad. However, it is using Core Graphics instead of OpenGL ES, so the rendering is not hardware accelerated.
Mapbox stated they are working on vector tiles and they'll probably provide an iOS solution for rendering, however it may use Mapnik so I am not sure how efficient will that be. And there's no ETA on since mid 2013.
[Q] Do you know of any other libraries, papers, guides, examples, or some other useful information on how to approach this? Basically how to handle the OSM data and how to actually use OpenGL ES / GLKit to draw that data on the device. Maybe some of the people who have done it can share a few things?
Old question, but there's a new answer.
WhirlyGlobe-Maply will render tile based vector maps on iOS. http://mousebirdconsulting.blogspot.com/2014/03/vector-maps-introduction.html
The technology that powered skobbler's ForeverMap 2 and their current GPS Nav & Maps app is now available on a pay-per use basis. See their developer platform.
Note: they also have a free tier that can be used to develop/launch small apps.
They render the map using OpenGL and "vector data tiles". This vector data tiles contain information regarding road geometry (so you can have routing), POI data & other map features. (eg. boundary limits).
There is a list of OSM-based applications for iOS. It also includes a few open source projects, for example Navit. Navit seems to render the map using SDL/OpenGL. See the Navit iOS wiki page for more information.

How to deal with inconsistent Chinese maps on iOS 6?

For Chinese maps on iOS 6, it seems that MapKit selects map provider based on your where the device is located. If you're in China it will use AutoNavi maps, and else it will use the default Apple maps. To complicate things, the AutoNavi maps seem to be transformed in the same way that Google's maps on iOS 5 are, whereas the default Apple maps are not transformed.
By transformed I'm talking about the fact that all maps in China are transformed, although this is not true. Rather, some maps in China are transformed, while some are not.
This transform makes it difficult to place annotations correctly on the map since the map is generally offset about 500 meters. Since it's not possible to reverse the transform of the actual map, the solution is to apply the same offset to the annotations.
There exists non-trivial ways to inverse the transform, at least for limited areas. The problem in iOS 6 is knowing whether or not the map is transformed to be able to compensate annotations appropriately. On iOS 5 this problem did not exist since the transformed maps were used consistently.
The Shanghai maps below illustrates the situation (the actual transform offset is not demonstrated).
So, would there be any way of knowing in run-time whether transformed or non-transformed China maps are used? Other ideas for dealing with this?
Edit: Routing network traffic through a proxy in China changes map apperance in the simulator, so the choice of map provider must be based on IP.
You could always use Bing Maps SDK if you absolutely need consistency - that is consistency between iOS versions and between people in USA or China. Although I would recommend sticking with MapKit.
It's about Martian Coordinate Systems.
Check this out:
https://github.com/Mardinate/Mardinate
Couldn't you get geo data from the phone and if they are in china apply the transformed annotations?

Using Mapkit offline

I would like to use the Mapkit framework in my app offline, so the user does not have to use roaming to download the tiles. I have seen other maps using google maps and have the tiles in the app without having to download them first.
How could this be done? Could the cached tiles in the cached.db saved somewhere in the project so they are there by default?
Would I need to create an overlay?
I have seen a number of similar questions, but I am still thinking there might be an answer somewhere out there. Is it really disallowed by Google to use their map images offline?
I know that I could use mapbox, but I am also sure the examples I have seen are not using mapbox.
A thread among many that I have searched:
Offline MapKit solution for iOS
Many thanks!
Andras
This is unfortunately not possible on iOS, there´s neither an API for caching nor is it allowing in the Terms of Usage. As you already stated the only way to allow offline mapping is by using other Map frameworks like Mapbox. MKMapView however does cache a few tiles as long as you loaded them while you had internet connection, you just don't have any control over how many tiles get cached or how long they get cached.
you can use overlay technique.Just download one geojson file and fetch data from that which contains coordinates.Plot those coordinates by using overlay.
This method will show your overlay as map in offline mode.

Good examples of MapServer / OpenLayers

I want to convince some clients to use MapServer and OpenLayers. Please can anyone suggest attractive websites to show off the possiblities!
The clients will be impressed by:
A density map (otherwise known as a heat map, colour-shaded grid coverage, contour plot...).
The ability for the user to download the underlying data for the density map, restricted to the area being viewed, in some format such as netCDF.
Standard OpenLayers stuff. Zooming, panning, scale bar, overview map...
Different base layers. Could be WMS, Google, Bing...
Searching for a placename, map is panned to display the place.
Exposing the heatmap data for other people to use in mashups as WMS or WCS
MapServer.org is back up but demo.mapserver.org seems to be down right now :( But from memory their examples didn't have the "wow" factor. The OpenLayers examples demonstrate only one or two features per example - I want something to wow the clients by showing all the capabilities in one example.
PS If you have good examples that use some other open source tools, post them by all means. But just JavaScript please: customer says no rich client.
EDIT Come on StackOverflow, someone must have an example that uses a density map?? I'm even offering a bounty now...
Note this answer is no longer relevant. The open source maps have since been replaced with a commercial alternative by a different company
http://maps.seai.ie/wind/ - mapping onshore and offshore wind speeds and farms in Ireland
http://maps.seai.ie/geothermal/ - mapping geothermal temperatures in Ireland, and borehole data
uses WMS services (and TileCache) for all the layers, so can be accessed by other client GIS's (well once I've set up metadata etc..)
has a variety of different base maps to choose from
built using MapFish / ExtJS
has drop down gazetteers for County and Townland (an Irish administrative unit)
all the basic map navigation tools and a simple info tool
right click on a layer to set transparency
uses MapServer opensource back-end, plus SQL Server 2008
The systems (and a third more complex Bioenergy Intranet system) got a mention here: http://www.geoconnexion.com/uploads/renewableenergy_intv9i4.pdf
http://haiticrisismap.org/ openlayes + geoxt
would it be possible to create a template map for the client with a bunch of data on it, census, socio, create some simple fake buffers.
Maybe have a look at the HeatMapAPI for Google Maps (not sure you'll wow the client with that though).
Another density map: http://maps.glassfish.org/server/ (showing the use of GlassFish around the world).
We're using the OpenLayers Heatmap layer, mostly because (for us) it handles large data volumes better than the Google Map version (your mileage may vary)
http://www.patrick-wied.at/static/heatmapjs/demo/maps_heatmap_layer/openlayers.php
By large data volumes, I mean location datasets with 100K+ rows
It also works nicely as an ASPX page with dynamic realtime data retrieval from an SQL Server database. I've used a stored procedure to pre-process the data into the array format, grouped by Latitude & Longitude.
For those that need a translation table to convert their UK Postcodes into Latitude & Longitude, here's a good source:
http://www.doogal.co.uk/UKPostcodes.php
The OneGeology Portal (http://portal.onegeology.org/OnegeologyGlobal/) has been online for about 10 years, currently running OpenLayers 2, with an OpenLayers 3 version in development.
The portal attempts to create a geological map of the world by pulling together disparate OGC services provided by data suppliers (mostly Geological Surveys) from across the globe. The portal provides access to data from WMS, WFS (simple and complex feature), and WCS. The portal uses CSW to help manage which functionality is available to a user, and provides the ability to style WMS layers through the application of custom SLD. Map contexts can be saved, shared and loaded using WMC.
There is a gazetteer to help you zoom to a location of choice, the ability to change projections, and scales, and the ability to create a KML file to allow the service to be used in Google Earth. Transparency can be changed on all layers.
There are currently 353 layers.
When the OneGeology project started, all documentation was geared to the support of services provided by MapServer, and many of the services in the portal are MapServer services. However, because the portal utilises open standards, any software that can provide services to those standards can be included.
This is an example of a classified grid generated in MapServer and displayed by OpenLayers: https://maps.greenwoodmap.com/sublette/mapserver/map#zcr=1/2690000/1170000/0&lyrs=slopesZ,townlim,ownership,roads. The raw, unclassified slope data can also queried by map click.

Resources