Simple & strightforward test of loading shape file and drawing it on MapKit on iOS8 using drawMapRect
GitHub:https://github.com/Sumbera/SHPonMapKit
- draws only polygons so far
- primitive optimization, no scale optimisation
Reading of shape file is performed by shapelib
//------------------------------------------------------------ NS_INLINE NSArray *getPolygonsFromShapeFile(NSString *shpFilePath){ const char *path = [shpFilePath cStringUsingEncoding:NSUTF8StringEncoding]; SHPHandle shp = SHPOpen(path, "rb"); int numEntities; int shapeType; SHPGetInfo(shp, &numEntities, &shapeType, NULL, NULL); NSMutableArray *allPolygons = [[NSMutableArray alloc]init]; for (int i=0; i<numEntities; i++){ SHPObject *shpObject = SHPReadObject(shp, i); if (shpObject->nSHPType == SHPT_POLYGON || shpObject->nSHPType == SHPT_POLYGONZ || shpObject->nSHPType == SHPT_POLYGONM){ int numParts = shpObject->nParts; int totalVertexCount = shpObject->nVertices; for (int n=0; n<numParts; n++) { int startVertex = shpObject->panPartStart[n]; int partVertexCount = (n == numParts - 1) ? totalVertexCount - startVertex : shpObject->panPartStart[n+1] - startVertex; int endIndex = startVertex + partVertexCount; CLLocationCoordinate2D coords[partVertexCount]; for (int pv = startVertex, i = 0; pv < endIndex; pv++,i++) { coords[i] =CLLocationCoordinate2DMake(shpObject->padfY[pv], shpObject->padfX[pv]); } // -- this actually converts lat lon to mkmappoints projection MKPolygon *singlePolygon = [MKPolygon polygonWithCoordinates:coords count:partVertexCount]; [allPolygons addObject:singlePolygon]; } } SHPDestroyObject(shpObject); } SHPClose(shp); return [allPolygons copy]; }
credits/inspiration:
drawing : http://stackoverflow.com/questions/17673410/mkmapview-with-multiple-overlays-memory-issue
parsing : http://www.al-tyus.com/blog/2013/10/14/mapkit-and-esri-shapefiles
shapelib: http://shapelib.maptools.org
dala: http://www.geoportalpraha.cz