{"id":21819984,"url":"https://github.com/ngageoint/geopackage-ios","last_synced_at":"2025-08-31T23:39:06.145Z","repository":{"id":2011777,"uuid":"44551447","full_name":"ngageoint/geopackage-ios","owner":"ngageoint","description":"GeoPackage iOS Library","archived":false,"fork":false,"pushed_at":"2024-04-16T11:47:36.000Z","size":373902,"stargazers_count":52,"open_issues_count":3,"forks_count":19,"subscribers_count":17,"default_branch":"master","last_synced_at":"2025-03-27T16:41:49.844Z","etag":null,"topics":["cocoapods","geopackage","geopackage-functionality","geopackage-ios","geopackage-libraries","geopackage-mapcache","ios","ios-lib","nga","objective-c","objective-c-library","sdk","swift","xcode"],"latest_commit_sha":null,"homepage":"http://ngageoint.github.io/geopackage-ios","language":"Objective-C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ngageoint.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2015-10-19T17:27:45.000Z","updated_at":"2025-03-14T13:36:37.000Z","dependencies_parsed_at":"2023-07-05T21:16:34.003Z","dependency_job_id":"c9246800-19b5-437c-a809-c86130af1aa0","html_url":"https://github.com/ngageoint/geopackage-ios","commit_stats":{"total_commits":1183,"total_committers":8,"mean_commits":147.875,"dds":0.4716821639898563,"last_synced_commit":"b527e798f86082679838732f7c8e28c2854d15e3"},"previous_names":[],"tags_count":49,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ngageoint%2Fgeopackage-ios","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ngageoint%2Fgeopackage-ios/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ngageoint%2Fgeopackage-ios/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ngageoint%2Fgeopackage-ios/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ngageoint","download_url":"https://codeload.github.com/ngageoint/geopackage-ios/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248812282,"owners_count":21165401,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cocoapods","geopackage","geopackage-functionality","geopackage-ios","geopackage-libraries","geopackage-mapcache","ios","ios-lib","nga","objective-c","objective-c-library","sdk","swift","xcode"],"created_at":"2024-11-27T16:27:46.671Z","updated_at":"2025-08-31T23:39:06.132Z","avatar_url":"https://github.com/ngageoint.png","language":"Objective-C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# GeoPackage iOS\n\n### GeoPackage iOS Lib ####\n\nThe [GeoPackage Libraries](http://ngageoint.github.io/GeoPackage/) were developed at the [National Geospatial-Intelligence Agency (NGA)](http://www.nga.mil/) in collaboration with [BIT Systems](https://www.caci.com/bit-systems/). The government has \"unlimited rights\" and is releasing this software to increase the impact of government investments by providing developers with the opportunity to take things in new directions. The software use, modification, and distribution rights are stipulated within the [MIT license](http://choosealicense.com/licenses/mit/).\n\n\n### Pull Requests ###\nIf you'd like to contribute to this project, please make a pull request. We'll review the pull request and discuss the changes. All pull request contributions to this project will be released under the MIT license.\n\nSoftware source code previously released under an open source license and then modified by NGA staff is considered a \"joint work\" (see 17 USC § 101); it is partially copyrighted, partially public domain, and as a whole is protected by the copyrights of the non-government authors and must be released according to the terms of the original open source license.\n\n### About ###\n\n[GeoPackage iOS](http://ngageoint.github.io/geopackage-ios/) is a [GeoPackage Library](http://ngageoint.github.io/GeoPackage/) Objective-C SDK implementation of the Open Geospatial Consortium [GeoPackage](http://www.geopackage.org/) [spec](http://www.geopackage.org/spec/).  It is listed as an [OGC GeoPackage Implementation](http://www.geopackage.org/#implementations_nga) by the National Geospatial-Intelligence Agency.\n\n\u003ca href='https://www.ogc.org/resource/products/details/?pid=1819'\u003e\n    \u003cimg src=\"https://github.com/ngageoint/GeoPackage/raw/master/docs/images/ogc.gif\" height=50\u003e\n\u003c/a\u003e\n\nThe GeoPackage SDK provides the ability to manage GeoPackage files providing read, write, import, export, share, and open support. Open GeoPackage files provide read and write access to features and tiles. Feature support includes Well-Known Binary and iOS Map shape translations. Tile generation supports creation by URL or features. Tile providers supporting GeoPackage format, standard tile API, and feature tile generation.\n\n### Usage ###\n\nView the latest [Appledoc](http://ngageoint.github.io/geopackage-ios/docs/api/).\n\n#### Example Apps ####\n\nThe following projects demonstrate usage of geopackage-ios in a host app.\n\n##### GeoPackage MapCache #####\n\nThe [GeoPackage MapCache](https://github.com/ngageoint/geopackage-mapcache-ios) app provides an extensive standalone example on how to use the SDK.\n\n##### MAGE #####\n\nThe [Mobile Awareness GEOINT Environment (MAGE)](https://github.com/ngageoint/mage-ios) app provides mobile situational awareness capabilities. It [uses the SDK](https://github.com/ngageoint/mage-ios/search?q=GeoPackage\u0026type=Code) to provide GeoPackage functionality.\n\n#### Objective-C Example ####\n```objectivec\n\n// NSString *geoPackageFile = ...;\n// MKMapView *mapView = ...;\n\n// Get a manager\nGPKGGeoPackageManager *manager = [GPKGGeoPackageFactory manager];\n\n// Available databases\nNSArray *databases = [manager databases];\n\n// Import database\nBOOL imported = [manager importGeoPackageFromPath:geoPackageFile];\n\n// Open database\nGPKGGeoPackage *geoPackage = [manager open:[databases objectAtIndex:0]];\n\n// GeoPackage Table DAOs\nGPKGSpatialReferenceSystemDao *srsDao = [geoPackage spatialReferenceSystemDao];\nGPKGContentsDao *contentsDao =  [geoPackage contentsDao];\nGPKGGeometryColumnsDao *geometryColumnsDao = [geoPackage geometryColumnsDao];\nGPKGTileMatrixSetDao *tileMatrixSetDao = [geoPackage tileMatrixSetDao];\nGPKGTileMatrixDao *tileMatrixDao = [geoPackage tileMatrixDao];\nGPKGSchemaExtension *schemaExtension = [[GPKGSchemaExtension alloc] initWithGeoPackage:geoPackage];\nGPKGDataColumnsDao *dataColumnsDao = [schemaExtension dataColumnsDao];\nGPKGDataColumnConstraintsDao *dataColumnConstraintsDao = [schemaExtension dataColumnConstraintsDao];\nGPKGMetadataExtension *metadataExtension = [[GPKGMetadataExtension alloc] initWithGeoPackage:geoPackage];\nGPKGMetadataDao *metadataDao = [metadataExtension metadataDao];\nGPKGMetadataReferenceDao *metadataReferenceDao = [metadataExtension metadataReferenceDao];\nGPKGExtensionsDao *extensionsDao = [geoPackage extensionsDao];\n\n// Feature and tile tables\nNSArray\u003cNSString *\u003e *features = [geoPackage featureTables];\nNSArray\u003cNSString *\u003e *tiles = [geoPackage tileTables];\n\n// Query Features\nNSString *featureTable = [features objectAtIndex:0];\nGPKGFeatureDao *featureDao = [geoPackage featureDaoWithTableName:featureTable];\nGPKGMapShapeConverter *converter = [[GPKGMapShapeConverter alloc] initWithProjection:featureDao.projection];\nGPKGRowResultSet *featureResults = [featureDao results:[featureDao queryForAll]];\n@try {\n    for (GPKGFeatureRow *featureRow in featureResults) {\n        GPKGGeometryData *geometryData = [featureRow geometry];\n        if (geometryData != nil \u0026\u0026 !geometryData.empty) {\n            SFGeometry *geometry = geometryData.geometry;\n            GPKGMapShape *shape = [converter toShapeWithGeometry:geometry];\n            GPKGMapShape *mapShape = [GPKGMapShapeConverter addMapShape:shape toMapView:mapView];\n            // ...\n            // Track the map shape to remove it at a later time\n            [mapShape removeFromMapView:mapView];\n        }\n    }\n} @finally {\n    [converter destroy];\n    [featureResults close];\n}\n\n// Query Tiles\nNSString *tileTable = [tiles objectAtIndex:0];\nGPKGTileDao *tileDao = [geoPackage tileDaoWithTableName:tileTable];\nGPKGRowResultSet *tileResults = [tileDao results:[tileDao queryForAll]];\n@try {\n    for (GPKGTileRow *tileRow in tileResults) {\n        NSData *tileData = [tileRow tileData];\n        UIImage *tileImage = [tileRow tileDataImage];\n        // ...\n    }\n} @finally {\n    [tileResults close];\n}\n\n// Retrieve Tiles by XYZ\nNSObject\u003cGPKGTileRetriever\u003e *retriever = [[GPKGGeoPackageTileRetriever alloc] initWithTileDao:tileDao];\nGPKGGeoPackageTile *geoPackageTile = [retriever tileWithX:2 andY:2 andZoom:2];\nif (geoPackageTile != nil) {\n    NSData *tileData = geoPackageTile.data;\n    UIImage *tileImage = [GPKGImageConverter toImage:tileData];\n    // ...\n}\n\n// Retrieve Tiles by Bounding Box\nGPKGTileCreator *tileCreator = [[GPKGTileCreator alloc] initWithTileDao:tileDao andProjection:[PROJProjectionFactory projectionWithEpsgInt:PROJ_EPSG_WORLD_GEODETIC_SYSTEM]];\nGPKGGeoPackageTile *geoPackageTile2 = [tileCreator tileWithBoundingBox:[[GPKGBoundingBox alloc] initWithMinLongitudeDouble:-90.0 andMinLatitudeDouble:0.0 andMaxLongitudeDouble:0.0 andMaxLatitudeDouble:66.513260]];\nif (geoPackageTile2 != nil) {\n    NSData *tileData = geoPackageTile2.data;\n    UIImage *tileImage = [GPKGImageConverter toImage:tileData];\n    // ...\n}\n\n// Tile Overlay (GeoPackage or Standard API)\nMKTileOverlay *tileOverlay = [GPKGOverlayFactory tileOverlayWithTileDao:tileDao];\ntileOverlay.canReplaceMapContent = false;\n[mapView addOverlay:tileOverlay];\n\nGPKGBoundingBox *boundingBox = [GPKGBoundingBox worldWebMercator];\nPROJProjection *projection = [PROJProjectionFactory projectionWithEpsgInt:PROJ_EPSG_WEB_MERCATOR];\n\n// Index Features\nGPKGFeatureIndexManager *indexer = [[GPKGFeatureIndexManager alloc] initWithGeoPackage:geoPackage andFeatureDao:featureDao andGeodesic:NO];\n[indexer setIndexLocation:GPKG_FIT_RTREE];\nint indexedCount = [indexer index];\n\n// Query Indexed Features in paginated chunks\nGPKGFeatureIndexResults *indexResults = [indexer queryForChunkWithBoundingBox:boundingBox inProjection:projection andLimit:50];\nGPKGRowPaginatedResults *paginatedResults = [indexer paginate:indexResults];\n@try {\n    for (GPKGFeatureRow *featureRow in paginatedResults) {\n        GPKGGeometryData *geometryData = [featureRow geometry];\n        if (geometryData != nil \u0026\u0026 !geometryData.empty) {\n            SFGeometry *geometry = geometryData.geometry;\n            // ...\n        }\n    }\n} @finally {\n    [paginatedResults close];\n}\n\n// Feature Tile Overlay (dynamically draw tiles from features)\nGPKGFeatureTiles *featureTiles = [[GPKGFeatureTiles alloc] initWithFeatureDao:featureDao andGeodesic:NO];\n[featureTiles setMaxFeaturesPerTile:[NSNumber numberWithInt:1000]];\nGPKGNumberFeaturesTile *numberFeaturesTile = [[GPKGNumberFeaturesTile alloc] init];\n[featureTiles setMaxFeaturesTileDraw:numberFeaturesTile];\n[featureTiles setIndexManager:indexer];\nGPKGFeatureOverlay *featureOverlay = [[GPKGFeatureOverlay alloc] initWithFeatureTiles:featureTiles];\n[featureOverlay setMinZoom:[NSNumber numberWithInt:[featureDao zoomLevel]]];\n[mapView addOverlay:featureOverlay];\n\n// Feature Overlay Query (query the features represented by tiles)\nGPKGFeatureOverlayQuery *featureOverlayQuery = [[GPKGFeatureOverlayQuery alloc] initWithBoundedOverlay:featureOverlay andFeatureTiles:featureTiles];\n[featureOverlayQuery calculateStylePixelBounds];\nGPKGBoundingBox *featureBounds = [featureDao boundingBox];\nindexResults = [featureOverlayQuery queryFeaturesWithBoundingBox:featureBounds];\n@try {\n    for (GPKGFeatureRow *featureRow in indexResults) {\n        SFGeometry *geometry = [featureRow geometryValue];\n        if (geometry != nil) {\n            // ...\n        }\n    }\n} @finally {\n    [indexResults close];\n}\n\n// URL Tile Generator (generate tiles from a URL)\nGPKGTileGenerator *urlTileGenerator = [[GPKGUrlTileGenerator alloc] initWithGeoPackage:geoPackage andTableName:@\"url_tile_table\" andTileUrl:@\"http://url/{z}/{x}/{y}.png\" andMinZoom:0 andMaxZoom:0 andBoundingBox:boundingBox andProjection:projection];\nint urlTileCount = [urlTileGenerator generateTiles];\n\n// Feature Tile Generator (generate tiles from features)\nGPKGTileGenerator *featureTileGenerator = [[GPKGFeatureTileGenerator alloc] initWithGeoPackage:geoPackage andTableName:[NSString stringWithFormat:@\"tiles_%@\", featureTable] andFeatureTiles:featureTiles andMinZoom:1 andMaxZoom:2 andBoundingBox:boundingBox andProjection:projection];\nint featureTileCount = [featureTileGenerator generateTiles];\n\n// Remove and close map overlays\n[mapView removeOverlay:tileOverlay];\n[mapView removeOverlay:featureOverlay];\n[featureTiles close];\n\n// Close database when done\n[geoPackage close];\n\n// Close manager when done\n[manager close];\n\n```\n\n#### Swift Example ####\n\nTo use from Swift, import the module:\n\n    import GeoPackage\n \n```swift\n\n// let geoPackageFile: String = ...\n// let mapView: MKMapView = ...\n\n// Get a manager\nlet manager: GPKGGeoPackageManager = GPKGGeoPackageFactory.manager()\n\n// Available databases\nlet databases: NSArray = manager.databases() as NSArray\n\n// Import database\nlet imported: Bool = manager.importGeoPackage(fromPath: geoPackageFile)\n\n// Open database\nlet geoPackage: GPKGGeoPackage = manager.open(databases.object(at: 0) as? String)\n\n// GeoPackage Table DAOs\nlet srsDao: GPKGSpatialReferenceSystemDao = geoPackage.spatialReferenceSystemDao()\nlet contentsDao: GPKGContentsDao = geoPackage.contentsDao()\nlet geometryColumnsDao: GPKGGeometryColumnsDao = geoPackage.geometryColumnsDao()\nlet tileMatrixSetDao: GPKGTileMatrixSetDao = geoPackage.tileMatrixSetDao()\nlet tileMatrixDao: GPKGTileMatrixDao = geoPackage.tileMatrixDao()\nlet schemaExtension : GPKGSchemaExtension = GPKGSchemaExtension.init(geoPackage: geoPackage)\nlet dataColumnsDao: GPKGDataColumnsDao = schemaExtension.dataColumnsDao()\nlet dataColumnConstraintsDao: GPKGDataColumnConstraintsDao = schemaExtension.dataColumnConstraintsDao()\nlet metadataExtension : GPKGMetadataExtension = GPKGMetadataExtension.init(geoPackage: geoPackage)\nlet metadataDao: GPKGMetadataDao = metadataExtension.metadataDao()\nlet metadataReferenceDao: GPKGMetadataReferenceDao = metadataExtension.metadataReferenceDao()\nlet extensionsDao: GPKGExtensionsDao = geoPackage.extensionsDao()\n\n// Feature and tile tables\nlet features: NSArray = geoPackage.featureTables() as NSArray\nlet tiles: NSArray = geoPackage.tileTables() as NSArray\n\n// Query Features\nlet featureTable: String = features.object(at: 0) as! String\nlet featureDao: GPKGFeatureDao = geoPackage.featureDao(withTableName: featureTable)\nlet converter: GPKGMapShapeConverter = GPKGMapShapeConverter(projection: featureDao.projection)\nlet featureResults: GPKGResultSet = featureDao.queryForAll()\ndo {\n    defer{converter.destroy()}\n    defer{featureResults.close()}\n    while (featureResults.moveToNext()) {\n        let featureRow: GPKGFeatureRow = featureDao.featureRow(featureResults)\n        let geometryData: GPKGGeometryData! = featureRow.geometry()\n        if (geometryData != nil \u0026\u0026 !geometryData.empty) {\n            let geometry: SFGeometry = geometryData.geometry\n            let shape: GPKGMapShape = converter.toShape(with: geometry)\n            let mapShape = GPKGMapShapeConverter.add(shape, to: mapView)\n            // ...\n            // Track the map shape to remove it at a later time\n            mapShape?.remove(from: mapView)\n        }\n    }\n}\n\n// Query Tiles\nlet tileTable: String = tiles.object(at: 0) as! String\nlet tileDao: GPKGTileDao = geoPackage.tileDao(withTableName: tileTable)\nlet tileResults: GPKGResultSet = tileDao.queryForAll()\ndo {\n    defer{tileResults.close()}\n    while (tileResults.moveToNext()) {\n        let tileRow: GPKGTileRow = tileDao.tileRow(tileResults)\n        let tileData: Data = tileRow.tileData()\n        let tileImage: UIImage = tileRow.tileDataImage()\n        // ...\n    }\n}\n\n// Retrieve Tiles by XYZ\nlet retriever = GPKGGeoPackageTileRetriever()\nlet geoPackageTile: GPKGGeoPackageTile! = retriever.tileWith(x: 2, andY: 2, andZoom: 2)\nif (geoPackageTile != nil) {\n    let tileData: Data = geoPackageTile.data\n    let tileImage: UIImage = GPKGImageConverter.toImage(tileData)\n    // ...\n}\n\n// Retrieve Tiles by Bounding Box\nlet tileCreator: GPKGTileCreator = GPKGTileCreator(tileDao: tileDao, andProjection: PROJProjectionFactory.projection(withEpsgInt: PROJ_EPSG_WORLD_GEODETIC_SYSTEM))\nlet geoPackageTile2: GPKGGeoPackageTile! = tileCreator.tile(with: GPKGBoundingBox(minLongitudeDouble: -90.0, andMinLatitudeDouble: 0.0, andMaxLongitudeDouble: 0.0, andMaxLatitudeDouble: 66.513260))\nif (geoPackageTile2 != nil) {\n    let tileData: Data = geoPackageTile2.data\n    let tileImage: UIImage = GPKGImageConverter.toImage(tileData)\n    // ...\n}\n\n// Tile Overlay (GeoPackage or Standard API)\nlet tileOverlay: MKTileOverlay = GPKGOverlayFactory.tileOverlay(with: tileDao)\ntileOverlay.canReplaceMapContent = false\nmapView.addOverlay(tileOverlay)\n\nlet boundingBox: GPKGBoundingBox = GPKGBoundingBox.worldWebMercator()\nlet projection: PROJProjection = PROJProjectionFactory.projection(withEpsgInt: PROJ_EPSG_WEB_MERCATOR)\n\n// Index Features\nlet indexer: GPKGFeatureIndexManager = GPKGFeatureIndexManager(geoPackage: geoPackage, andFeatureDao: featureDao)\nindexer.indexLocation = GPKG_FIT_RTREE\nlet indexedCount = indexer.index()\n\n// Query Indexed Features in paginated chunks\nvar indexResults: GPKGFeatureIndexResults = indexer.queryForChunk(with: boundingBox, in: projection, andLimit: 50)\nlet paginatedResults: GPKGRowPaginatedResults = indexer.paginate(indexResults)\ndo {\n    defer{paginatedResults.close()}\n    while (paginatedResults.moveToNext()) {\n        let featureRow: GPKGFeatureRow = paginatedResults.userRow() as! GPKGFeatureRow\n        let geometryData: GPKGGeometryData! = featureRow.geometry()\n        if (geometryData != nil \u0026\u0026 !geometryData.empty) {\n            let geometry: SFGeometry = geometryData.geometry\n            // ...\n        }\n    }\n}\n\n// Feature Tile Overlay (dynamically draw tiles from features)\nlet featureTiles: GPKGFeatureTiles = GPKGFeatureTiles(featureDao: featureDao)\nfeatureTiles.maxFeaturesPerTile = 1000\nlet numberFeaturesTile: GPKGNumberFeaturesTile = GPKGNumberFeaturesTile()\nfeatureTiles.maxFeaturesTileDraw = numberFeaturesTile\nfeatureTiles.indexManager = indexer\nlet featureOverlay: GPKGFeatureOverlay! = GPKGFeatureOverlay(featureTiles: featureTiles)\nfeatureOverlay.minZoom = NSNumber(value:featureDao.zoomLevel())\nmapView.addOverlay(featureOverlay!)\n\n// Feature Overlay Query (query the features represented by tiles)\nlet featureOverlayQuery: GPKGFeatureOverlayQuery = GPKGFeatureOverlayQuery(boundedOverlay: featureOverlay, andFeatureTiles: featureTiles)\nfeatureOverlayQuery.calculateStylePixelBounds()\nlet featureBounds: GPKGBoundingBox = featureDao.boundingBox()\nindexResults = featureOverlayQuery.queryFeatures(with: featureBounds)\ndo {\n    defer{indexResults.close()}\n    while (indexResults.moveToNext()) {\n        let featureRow: GPKGFeatureRow = indexResults.featureRow()\n        let geometry: SFGeometry! = featureRow.geometryValue()\n        if (geometry != nil) {\n            // ...\n        }\n    }\n}\n\n// URL Tile Generator (generate tiles from a URL)\nlet urlTileGenerator: GPKGTileGenerator = GPKGUrlTileGenerator(geoPackage: geoPackage, andTableName: \"url_tile_table\", andTileUrl: \"http://url/{z}/{x}/{y}.png\", andMinZoom: 1, andMaxZoom: 2, andBoundingBox:boundingBox, andProjection:projection)\nlet urlTileCount: Int32 = urlTileGenerator.generateTiles()\n\n// Feature Tile Generator (generate tiles from features)\nlet featureTileGenerator: GPKGTileGenerator = GPKGFeatureTileGenerator(geoPackage: geoPackage, andTableName: featureTable + \"_tiles\", andFeatureTiles: featureTiles, andMinZoom: 1, andMaxZoom: 2, andBoundingBox:boundingBox, andProjection:projection)\nlet featureTileCount: Int32 = featureTileGenerator.generateTiles()\n\n// Remove and close map overlays\nmapView.removeOverlay(tileOverlay)\nmapView.removeOverlay(featureOverlay)\nfeatureTiles.close()\n\n// Close database when done\ngeoPackage.close()\n\n// Close manager when done\nmanager.close()\n\n```\n\n### Build ###\n\n[![Build](https://github.com/ngageoint/geopackage-ios/workflows/Build/badge.svg)](https://github.com/ngageoint/geopackage-ios/actions/workflows/build.yml)\n\nBuild and Test (Uses UIKit, so we build with xcodebuild instead of SPM).\n\n    ./build.sh\n\nYou can build and test if you open the Package.swift in Xcode.\n\n\n### Include Library ###\n\nUse this library via SPM in your Package.swift:\n\n    dependencies: [\n        .package(url: \"https://github.com/ngageoint/geopackage-ios.git\", branch: \"release/9.0.0\"),\n    ]\n    \nOr as a tagged release:\n\n    dependencies: [\n        .package(url: \"https://github.com/ngageoint/geopackage-ios.git\", from: \"9.0.0\"),\n    ]\n\nReference it in your Package.swift target:\n\n    .target(\n        name: \"MyApp\",\n        dependencies: [\n            .product(name: \"GeoPackage\", package: \"geopackage-ios\"),\n        ],\n    ),\n\n### Remote Dependencies ###\n\n* [Simple Features WKB](https://github.com/ngageoint/simple-features-wkb-ios) (The MIT License (MIT)) - Simple Features Well Known Binary Lib\n* [Simple Features WKT](https://github.com/ngageoint/simple-features-wkt-ios) (The MIT License (MIT)) - Simple Features Well Known Text Lib\n* [Simple Features Projection](https://github.com/ngageoint/simple-features-proj-ios) (The MIT License (MIT)) - Simple Features Projection Lib\n* [OGC API Features JSON](https://github.com/ngageoint/ogc-api-features-json-ios) (The MIT License (MIT)) - OGC API Features JSON Lib\n* [Color](https://github.com/ngageoint/color-ios) (The MIT License (MIT)) - Color Lib\n* [TIFF](https://github.com/ngageoint/tiff-ios) (The MIT License (MIT)) - Tagged Image File Format Lib\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fngageoint%2Fgeopackage-ios","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fngageoint%2Fgeopackage-ios","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fngageoint%2Fgeopackage-ios/lists"}