Skip to content

Commit 7dbd260

Browse files
committed
8.0.2 release
1 parent cafdb75 commit 7dbd260

1,212 files changed

Lines changed: 29390 additions & 29025 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ Adheres to [Semantic Versioning](http://semver.org/).
44

55
---
66

7-
## 8.0.2 (TBD)
7+
## [8.0.2](https://github.com/ngageoint/geopackage-ios/releases/tag/8.0.2) (08-21-2023)
88

9-
* TBD
9+
* GPKGFeatureOverlay and GPKGFeatureOverlayQuery close methods for embedded GPKGFeatureTiles
1010

1111
## [8.0.1](https://github.com/ngageoint/geopackage-ios/releases/tag/8.0.1) (08-18-2023)
1212

README.md

Lines changed: 75 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,12 @@ Include this repository by specifying it in a Podfile using a supported option.
3434

3535
Pull from [CocoaPods](https://cocoapods.org/pods/geopackage-ios):
3636

37-
pod 'geopackage-ios', '~> 8.0.1'
37+
pod 'geopackage-ios', '~> 8.0.2'
3838

3939
Pull 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

4444
Include as local project:
4545

@@ -103,16 +103,18 @@ GPKGFeatureDao *featureDao = [geoPackage featureDaoWithTableName:featureTable];
103103
GPKGMapShapeConverter *converter = [[GPKGMapShapeConverter alloc] initWithProjection:featureDao.projection];
104104
GPKGRowResultSet *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];
122124
GPKGTileDao *tileDao = [geoPackage tileDaoWithTableName:tileTable];
123125
GPKGRowResultSet *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
135137
NSObject<GPKGTileRetriever> *retriever = [[GPKGGeoPackageTileRetriever alloc] initWithTileDao:tileDao];
136138
GPKGGeoPackageTile *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
144146
GPKGTileCreator *tileCreator = [[GPKGTileCreator alloc] initWithTileDao:tileDao andProjection:[PROJProjectionFactory projectionWithEpsgInt:PROJ_EPSG_WORLD_GEODETIC_SYSTEM]];
145147
GPKGGeoPackageTile *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
166168
GPKGFeatureIndexResults *indexResults = [indexer queryForChunkWithBoundingBox:boundingBox inProjection:projection andLimit:50];
167169
GPKGRowPaginatedResults *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)
187209
GPKGTileGenerator *urlTileGenerator = [[GPKGUrlTileGenerator alloc] initWithGeoPackage:geoPackage andTableName:@"url_tile_table" andTileUrl:@"http://url/{z}/{x}/{y}.png" andMinZoom:0 andMaxZoom:0 andBoundingBox:boundingBox andProjection:projection];
188210
int urlTileCount = [urlTileGenerator generateTiles];
@@ -191,6 +213,11 @@ int urlTileCount = [urlTileGenerator generateTiles];
191213
GPKGTileGenerator *featureTileGenerator = [[GPKGFeatureTileGenerator alloc] initWithGeoPackage:geoPackage andTableName:[NSString stringWithFormat:@"tiles_%@", featureTable] andFeatureTiles:featureTiles andMinZoom:1 andMaxZoom:2 andBoundingBox:boundingBox andProjection:projection];
192214
int 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
245272
let featureDao: GPKGFeatureDao = geoPackage.featureDao(withTableName: featureTable)
246273
let converter: GPKGMapShapeConverter = GPKGMapShapeConverter(projection: featureDao.projection)
247274
let 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
}
@@ -264,9 +293,9 @@ do{
264293
let tileTable: String = tiles.object(at: 0) as! String
265294
let tileDao: GPKGTileDao = geoPackage.tileDao(withTableName: tileTable)
266295
let 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()
@@ -277,7 +306,7 @@ do{
277306
// Retrieve Tiles by XYZ
278307
let retriever = GPKGGeoPackageTileRetriever()
279308
let 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
287316
let tileCreator: GPKGTileCreator = GPKGTileCreator(tileDao: tileDao, andProjection: PROJProjectionFactory.projection(withEpsgInt: PROJ_EPSG_WORLD_GEODETIC_SYSTEM))
288317
let 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
306335
let 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)
310339
let 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
330359
featureOverlay.minZoom = NSNumber(value:featureDao.zoomLevel())
331360
mapView.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)
334379
let urlTileGenerator: GPKGTileGenerator = GPKGUrlTileGenerator(geoPackage: geoPackage, andTableName: "url_tile_table", andTileUrl: "http://url/{z}/{x}/{y}.png", andMinZoom: 1, andMaxZoom: 2, andBoundingBox:boundingBox, andProjection:projection)
335380
let urlTileCount: Int32 = urlTileGenerator.generateTiles()
@@ -338,6 +383,11 @@ let urlTileCount: Int32 = urlTileGenerator.generateTiles()
338383
let featureTileGenerator: GPKGTileGenerator = GPKGFeatureTileGenerator(geoPackage: geoPackage, andTableName: featureTable + "_tiles", andFeatureTiles: featureTiles, andMinZoom: 1, andMaxZoom: 2, andBoundingBox:boundingBox, andProjection:projection)
339384
let 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
342392
geoPackage.close()
343393

0 commit comments

Comments
 (0)