First set up a project directory to hold your work:
cd ~/projects
mkdir mapnik-ios-test
cd mapnik-ios-test
Next clone the mapbox-ios-example
repo to get the MapBox iOS SDK and example code setup
git clone [email protected]:mapbox/mapbox-ios-example.git
cd mapbox-ios-example
Download and unpack the Mapnik iOS SDK
curl -f -O http://mapnik.s3.amazonaws.com/dist/v2.2.0/mapnik-ios-v2.2.0.tar.bz2
tar xf mapnik-ios-v2.2.0.tar.bz2 # will give you a 'mapnik-ios' directory
# put the protoc compiler on your path so you can build mapnik-vector-tile
export PATH=`pwd`/mapnik-ios/bin:$PATH
Get the mapnik-vector-tile
code and build it
git clone [email protected]:mapbox/mapnik-vector-tile.git
cd mapnik-vector-tile
make
cd ../
Set up the MapBox SDK
git submodule update --init --recursive
# checkout `mapnik` branch of MapBox SDK
cd MapBox-iOS-SDK
git fetch -v
git checkout mapnik
cd ../
Now create an xcconfig file dynamically based on the Mapnik SDK build settings
# reference on options: http://developer.apple.com/library/mac/#documentation/DeveloperTools/Reference/XcodeBuildSettingRef/1-Build_Setting_Reference/build_setting_ref.html
echo 'COMPRESS_PNG_FILES = NO' > mapnik-ios.xcconfig
echo 'GCC_VERSION = com.apple.compilers.llvm.clang.1_0' >> mapnik-ios.xcconfig
echo 'CLANG_CXX_LANGUAGE_STANDARD = gnu++98' >> mapnik-ios.xcconfig
echo 'CLANG_CXX_LIBRARY = libstdc++' >> mapnik-ios.xcconfig
echo 'OTHER_CPLUSPLUSFLAGS = $(inherited) -I"$(SRCROOT)/mapnik-ios/include/" -I"$(SRCROOT)/mapnik-vector-tile/src/" '$(./mapnik-ios/bin/mapnik-config --defines) >> mapnik-ios.xcconfig
echo 'OTHER_LDFLAGS = $(inherited) -L"$(SRCROOT)/mapnik-ios/lib" -lmapnik -lprotobuf-lite '$(./mapnik-ios/bin/mapnik-config --dep-libs) >> mapnik-ios.xcconfig
Now open the sample project that came with the mapbox-io-example
clone
open "MapBox Example.xcodeproj"
Add the mapnik-ios.xcconfig
to your project: a good way to do this is drag/drop in into your MapBox Example> Supporting Files
Then edit the Project > Info > Based on Configuration File
and set the Release and Debug configurations at the project level to use 'mapnik-ios.xcconfig'. NOTE: only set it at the project
level, not the target
. All targets should inherit from the project
level xcconfig setting. If you are not seeing this happening try cleaning the project multiple times or closing and re-opening XCode (it tends to frustratingly and mysteriously cache things).
Now we are ready to test building the project. Hit Build and Run
.
Next let's test actually including Mapnik C++ headers:
-
Find some view controller code like
MapBox Example/OfflineLayerViewController.m
-
Either change the extension to
.mm
or set theIdentity and Type > File Type
toObjective C++ Source
-
In your view controller code put
#include <mapnik/map.hpp>
near the top of the file and the following code inside theviewDidLoad
:
mapnik::Map m(256,256);
NSLog(@"map dimensions: %d/%d", m.width(), m.height());
-
Do a test build and make sure compile and linking is working.
-
If it is working your Mapnik iOS SDK is working. If you hit missing headers or link errors then please create an issue at https://github.com/mapnik/mapnik-support/issues to report the problem
Note: a common problem is for the <mapnik/map.hpp>
header to not be found. This is because the mapnik-ios.xcconfig
is either not set up correctly or being read by your project correctly. Please repeat the setup steps again to make sure you did not miss anything.
Next steps: COMING SOON
Is it possible to have OSM / GDAL / OGR libraries into the fat binary of mapnik for iOS?
better yet, is it possible to share the makefile or bash file to compile manik for iOS on mac osx? (I can see that you use scone for building Mapnik, is it possible to change the script for arch. armv7x?)
or is it possible to have other libs included in the project on demand.
I don't see libshape (ESRi Shape files) in the lib directory.