@@ -34,12 +34,12 @@ Include this repository by specifying it in a Podfile using a supported option.
3434
3535Pull from [ CocoaPods] ( https://cocoapods.org/pods/geopackage-ios ) :
3636
37- pod 'geopackage-ios', '~> 8.0.1 '
37+ pod 'geopackage-ios', '~> 8.0.2 '
3838
3939Pull from GitHub via CocoaPods:
4040
4141 pod 'geopackage-ios', :git => 'https://github.com/ngageoint/geopackage-ios.git', :branch => 'master'
42- pod 'geopackage-ios', :git => 'https://github.com/ngageoint/geopackage-ios.git', :tag => '8.0.1 '
42+ pod 'geopackage-ios', :git => 'https://github.com/ngageoint/geopackage-ios.git', :tag => '8.0.2 '
4343
4444Include as local project:
4545
@@ -103,16 +103,18 @@ GPKGFeatureDao *featureDao = [geoPackage featureDaoWithTableName:featureTable];
103103GPKGMapShapeConverter * converter = [[ GPKGMapShapeConverter alloc] initWithProjection: featureDao .projection] ;
104104GPKGRowResultSet * featureResults = [ featureDao results:[ featureDao queryForAll]] ;
105105@try {
106- for(GPKGFeatureRow * featureRow in featureResults){
106+ for (GPKGFeatureRow * featureRow in featureResults) {
107107 GPKGGeometryData * geometryData = [ featureRow geometry] ;
108- if(geometryData != nil && !geometryData.empty){
108+ if (geometryData != nil && !geometryData.empty) {
109109 SFGeometry * geometry = geometryData.geometry;
110110 GPKGMapShape * shape = [ converter toShapeWithGeometry: geometry ] ;
111111 GPKGMapShape * mapShape = [ GPKGMapShapeConverter addMapShape: shape toMapView: mapView ] ;
112112 // ...
113+ // Track the map shape to remove it at a later time
114+ [ mapShape removeFromMapView: mapView ] ;
113115 }
114116 }
115- }@finally {
117+ } @finally {
116118 [ converter destroy] ;
117119 [ featureResults close] ;
118120}
@@ -122,19 +124,19 @@ NSString *tileTable = [tiles objectAtIndex:0];
122124GPKGTileDao * tileDao = [ geoPackage tileDaoWithTableName: tileTable ] ;
123125GPKGRowResultSet * tileResults = [ tileDao results:[ tileDao queryForAll]] ;
124126@try {
125- for(GPKGTileRow * tileRow in tileResults){
127+ for (GPKGTileRow * tileRow in tileResults) {
126128 NSData * tileData = [ tileRow tileData] ;
127129 UIImage * tileImage = [ tileRow tileDataImage] ;
128130 // ...
129131 }
130- }@finally {
132+ } @finally {
131133 [ tileResults close] ;
132134}
133135
134136// Retrieve Tiles by XYZ
135137NSObject<GPKGTileRetriever > * retriever = [[ GPKGGeoPackageTileRetriever alloc] initWithTileDao: tileDao ] ;
136138GPKGGeoPackageTile * geoPackageTile = [ retriever tileWithX:2 andY:2 andZoom:2] ;
137- if(geoPackageTile != nil){
139+ if (geoPackageTile != nil) {
138140 NSData * tileData = geoPackageTile.data;
139141 UIImage * tileImage = [ GPKGImageConverter toImage: tileData ] ;
140142 // ...
@@ -143,7 +145,7 @@ if(geoPackageTile != nil){
143145// Retrieve Tiles by Bounding Box
144146GPKGTileCreator * tileCreator = [[ GPKGTileCreator alloc] initWithTileDao: tileDao andProjection:[ PROJProjectionFactory projectionWithEpsgInt: PROJ_EPSG_WORLD_GEODETIC_SYSTEM ]] ;
145147GPKGGeoPackageTile * geoPackageTile2 = [ tileCreator tileWithBoundingBox:[[ GPKGBoundingBox alloc] initWithMinLongitudeDouble:-90.0 andMinLatitudeDouble:0.0 andMaxLongitudeDouble:0.0 andMaxLatitudeDouble:66.513260]] ;
146- if(geoPackageTile2 != nil){
148+ if (geoPackageTile2 != nil) {
147149 NSData * tileData = geoPackageTile2.data;
148150 UIImage * tileImage = [ GPKGImageConverter toImage: tileData ] ;
149151 // ...
@@ -165,12 +167,16 @@ int indexedCount = [indexer index];
165167// Query Indexed Features in paginated chunks
166168GPKGFeatureIndexResults * indexResults = [ indexer queryForChunkWithBoundingBox: boundingBox inProjection: projection andLimit:50] ;
167169GPKGRowPaginatedResults * paginatedResults = [ indexer paginate: indexResults ] ;
168- for(GPKGFeatureRow * featureRow in paginatedResults){
169- GPKGGeometryData * geometryData = [ featureRow geometry] ;
170- if(geometryData != nil && !geometryData.empty){
171- SFGeometry * geometry = geometryData.geometry;
172- // ...
170+ @try {
171+ for (GPKGFeatureRow * featureRow in paginatedResults) {
172+ GPKGGeometryData * geometryData = [ featureRow geometry] ;
173+ if (geometryData != nil && !geometryData.empty) {
174+ SFGeometry * geometry = geometryData.geometry;
175+ // ...
176+ }
173177 }
178+ } @finally {
179+ [ paginatedResults close] ;
174180}
175181
176182// Feature Tile Overlay (dynamically draw tiles from features)
@@ -183,6 +189,22 @@ GPKGFeatureOverlay *featureOverlay = [[GPKGFeatureOverlay alloc] initWithFeature
183189[ featureOverlay setMinZoom:[ NSNumber numberWithInt:[ featureDao zoomLevel]]] ;
184190[ mapView addOverlay: featureOverlay ] ;
185191
192+ // Feature Overlay Query (query the features represented by tiles)
193+ GPKGFeatureOverlayQuery * featureOverlayQuery = [[ GPKGFeatureOverlayQuery alloc] initWithBoundedOverlay: featureOverlay andFeatureTiles: featureTiles ] ;
194+ [ featureOverlayQuery calculateStylePixelBounds] ;
195+ GPKGBoundingBox * featureBounds = [ featureDao boundingBox] ;
196+ indexResults = [ featureOverlayQuery queryFeaturesWithBoundingBox: featureBounds ] ;
197+ @try {
198+ for (GPKGFeatureRow * featureRow in indexResults) {
199+ SFGeometry * geometry = [ featureRow geometryValue] ;
200+ if (geometry != nil) {
201+ // ...
202+ }
203+ }
204+ } @finally {
205+ [ indexResults close] ;
206+ }
207+
186208// URL Tile Generator (generate tiles from a URL)
187209GPKGTileGenerator * urlTileGenerator = [[ GPKGUrlTileGenerator alloc] initWithGeoPackage: geoPackage andTableName:@"url_tile_table" andTileUrl:@"http://url/{z}/{x}/{y}.png " andMinZoom:0 andMaxZoom:0 andBoundingBox: boundingBox andProjection: projection ] ;
188210int urlTileCount = [ urlTileGenerator generateTiles] ;
@@ -191,6 +213,11 @@ int urlTileCount = [urlTileGenerator generateTiles];
191213GPKGTileGenerator * featureTileGenerator = [[ GPKGFeatureTileGenerator alloc] initWithGeoPackage: geoPackage andTableName:[ NSString stringWithFormat:@"tiles_ %@", featureTable] andFeatureTiles: featureTiles andMinZoom:1 andMaxZoom:2 andBoundingBox: boundingBox andProjection: projection ] ;
192214int featureTileCount = [ featureTileGenerator generateTiles] ;
193215
216+ // Remove and close map overlays
217+ [ mapView removeOverlay: tileOverlay ] ;
218+ [ mapView removeOverlay: featureOverlay ] ;
219+ [ featureTiles close] ;
220+
194221// Close database when done
195222[ geoPackage close] ;
196223
@@ -245,17 +272,19 @@ let featureTable: String = features.object(at: 0) as! String
245272let featureDao: GPKGFeatureDao = geoPackage.featureDao(withTableName: featureTable)
246273let converter: GPKGMapShapeConverter = GPKGMapShapeConverter(projection: featureDao.projection)
247274let featureResults: GPKGResultSet = featureDao.queryForAll()
248- do{
275+ do {
249276 defer{converter.destroy()}
250277 defer{featureResults.close()}
251- while(featureResults.moveToNext()){
278+ while (featureResults.moveToNext()) {
252279 let featureRow: GPKGFeatureRow = featureDao.featureRow(featureResults)
253280 let geometryData: GPKGGeometryData! = featureRow.geometry()
254- if(geometryData != nil && !geometryData.empty){
281+ if (geometryData != nil && !geometryData.empty) {
255282 let geometry: SFGeometry = geometryData.geometry
256283 let shape: GPKGMapShape = converter.toShape(with: geometry)
257284 let mapShape = GPKGMapShapeConverter.add(shape, to: mapView)
258285 // ...
286+ // Track the map shape to remove it at a later time
287+ mapShape?.remove(from: mapView)
259288 }
260289 }
261290}
264293let tileTable: String = tiles.object(at: 0) as! String
265294let tileDao: GPKGTileDao = geoPackage.tileDao(withTableName: tileTable)
266295let tileResults: GPKGResultSet = tileDao.queryForAll()
267- do{
296+ do {
268297 defer{tileResults.close()}
269- while(tileResults.moveToNext()){
298+ while (tileResults.moveToNext()) {
270299 let tileRow: GPKGTileRow = tileDao.tileRow(tileResults)
271300 let tileData: Data = tileRow.tileData()
272301 let tileImage: UIImage = tileRow.tileDataImage()
277306// Retrieve Tiles by XYZ
278307let retriever = GPKGGeoPackageTileRetriever()
279308let geoPackageTile: GPKGGeoPackageTile! = retriever.tileWith(x: 2, andY: 2, andZoom: 2)
280- if(geoPackageTile != nil){
309+ if (geoPackageTile != nil) {
281310 let tileData: Data = geoPackageTile.data
282311 let tileImage: UIImage = GPKGImageConverter.toImage(tileData)
283312 // ...
@@ -286,7 +315,7 @@ if(geoPackageTile != nil){
286315// Retrieve Tiles by Bounding Box
287316let tileCreator: GPKGTileCreator = GPKGTileCreator(tileDao: tileDao, andProjection: PROJProjectionFactory.projection(withEpsgInt: PROJ_EPSG_WORLD_GEODETIC_SYSTEM))
288317let geoPackageTile2: GPKGGeoPackageTile! = tileCreator.tile(with: GPKGBoundingBox(minLongitudeDouble: -90.0, andMinLatitudeDouble: 0.0, andMaxLongitudeDouble: 0.0, andMaxLatitudeDouble: 66.513260))
289- if(geoPackageTile2 != nil){
318+ if (geoPackageTile2 != nil) {
290319 let tileData: Data = geoPackageTile2.data
291320 let tileImage: UIImage = GPKGImageConverter.toImage(tileData)
292321 // ...
@@ -306,14 +335,14 @@ indexer.indexLocation = GPKG_FIT_RTREE
306335let indexedCount = indexer.index()
307336
308337// Query Indexed Features in paginated chunks
309- let indexResults: GPKGFeatureIndexResults = indexer.queryForChunk(with: boundingBox, in: projection, andLimit: 50)
338+ var indexResults: GPKGFeatureIndexResults = indexer.queryForChunk(with: boundingBox, in: projection, andLimit: 50)
310339let paginatedResults: GPKGRowPaginatedResults = indexer.paginate(indexResults)
311- do{
340+ do {
312341 defer{paginatedResults.close()}
313- while(paginatedResults.moveToNext()){
342+ while (paginatedResults.moveToNext()) {
314343 let featureRow: GPKGFeatureRow = paginatedResults.userRow() as! GPKGFeatureRow
315344 let geometryData: GPKGGeometryData! = featureRow.geometry()
316- if(geometryData != nil && !geometryData.empty){
345+ if (geometryData != nil && !geometryData.empty) {
317346 let geometry: SFGeometry = geometryData.geometry
318347 // ...
319348 }
@@ -330,6 +359,22 @@ let featureOverlay: GPKGFeatureOverlay! = GPKGFeatureOverlay(featureTiles: featu
330359featureOverlay.minZoom = NSNumber(value:featureDao.zoomLevel())
331360mapView.addOverlay(featureOverlay!)
332361
362+ // Feature Overlay Query (query the features represented by tiles)
363+ let featureOverlayQuery: GPKGFeatureOverlayQuery = GPKGFeatureOverlayQuery(boundedOverlay: featureOverlay, andFeatureTiles: featureTiles)
364+ featureOverlayQuery.calculateStylePixelBounds()
365+ let featureBounds: GPKGBoundingBox = featureDao.boundingBox()
366+ indexResults = featureOverlayQuery.queryFeatures(with: featureBounds)
367+ do {
368+ defer{indexResults.close()}
369+ while (indexResults.moveToNext()) {
370+ let featureRow: GPKGFeatureRow = indexResults.featureRow()
371+ let geometry: SFGeometry! = featureRow.geometryValue()
372+ if (geometry != nil) {
373+ // ...
374+ }
375+ }
376+ }
377+
333378// URL Tile Generator (generate tiles from a URL)
334379let urlTileGenerator: GPKGTileGenerator = GPKGUrlTileGenerator(geoPackage: geoPackage, andTableName: "url_tile_table", andTileUrl: "http://url/{z}/{x}/{y}.png", andMinZoom: 1, andMaxZoom: 2, andBoundingBox:boundingBox, andProjection:projection)
335380let urlTileCount: Int32 = urlTileGenerator.generateTiles()
@@ -338,6 +383,11 @@ let urlTileCount: Int32 = urlTileGenerator.generateTiles()
338383let featureTileGenerator: GPKGTileGenerator = GPKGFeatureTileGenerator(geoPackage: geoPackage, andTableName: featureTable + "_tiles", andFeatureTiles: featureTiles, andMinZoom: 1, andMaxZoom: 2, andBoundingBox:boundingBox, andProjection:projection)
339384let featureTileCount: Int32 = featureTileGenerator.generateTiles()
340385
386+ // Remove and close map overlays
387+ mapView.removeOverlay(tileOverlay)
388+ mapView.removeOverlay(featureOverlay)
389+ featureTiles.close()
390+
341391// Close database when done
342392geoPackage.close()
343393
0 commit comments