In the introductory post, we gave a brief description of the Backendless Geolocation service and wrote how to setup sample geodata. Now that we have a collection of geopoints, let’s look into the API to retrieve these points. Similar to data objects, Backendless returns geopoints using paged data.
Consider the following sample code:
final BackendlessGeoQuery geoQuery = new BackendlessGeoQuery(); geoQuery.addCategory("geoservice_sample"); geoQuery.setIncludeMeta(true); Backendless.Geo.getGeopointCount(geoQuery, new AsyncCallback<Integer>() { @Override public void handleResponse(Integer count) { Log.i(TAG, "Total points in category " + count); Backendless.Geo.getPoints(geoQuery, new AsyncCallback<List<GeoPoint>>() { @Override public void handleResponse(List<GeoPoint> points) { for (GeoPoint geoPoint : points) { Log.i(TAG, "GeoPoint: latitude - " + geoPoint.getLatitude() + ", longitude - " + geoPoint.getLongitude()); Log.i(TAG, "\tmetadata: "); for (Map.Entry entry : geoPoint.getMetadata().entrySet()) Log.i(TAG, "\t\t" + entry.getKey() + " - " + entry.getValue()); } if (points.size() == geoQuery.getPageSize()) { geoQuery.prepareForNextPage(); Backendless.Geo.getPoints(geoQuery, this); } } @Override public void handleFault(BackendlessFault fault) { Log.e(TAG, fault.getMessage()); } }); } @Override public void handleFault(BackendlessFault fault) { Log.e(TAG, fault.getMessage()); } });
val geoQuery = BackendlessGeoQuery() geoQuery.addCategory("geoservice_sample") geoQuery.isIncludeMeta = true Backendless.Geo.getGeopointCount(geoQuery, object : AsyncCallback<Int> { override fun handleResponse(count: Int?) { Log.i(TAG, "Total points in category $count") Backendless.Geo.getPoints(geoQuery, object : AsyncCallback<List<GeoPoint>> { override fun handleResponse(points: List<GeoPoint>) { for (geoPoint in points) { Log.i(TAG, "GeoPoint: latitude - ${geoPoint.latitude}, longitude - ${geoPoint.longitude}") Log.i(TAG, "\tmetadata: ") for ((key, value) in geoPoint.metadata) Log.i(TAG, "\t\t$key - $value") } if (points.size == geoQuery.pageSize) { geoQuery.prepareForNextPage() Backendless.Geo.getPoints(geoQuery, this) } } override fun handleFault(fault: BackendlessFault) { Log.e(TAG, fault.message) } }) } override fun handleFault(fault: BackendlessFault) { Log.e(TAG, fault.message) } })
__block BOOL firstResponse = YES; BackendlessGeoQuery *geoQuery = [BackendlessGeoQuery new]; geoQuery.categories = @[@"geoservice_sample"]; geoQuery.includemetadata = YES; - (void)loadGeoPoints { [Backendless.shared.geo getPointsWithGeoQuery:geoQuery responseHandler:^(NSArray *points) { [Backendless.shared.geo getPointsCountWithGeoQuery:self->geoQuery responseHandler:^(NSInteger totalPoints) { if (self->firstResponse) { self->firstResponse = NO; NSLog(@"Total points in category %li", (long)totalPoints); } if (points.count > 0) { for (GeoPoint *point in points) { NSLog(@"GeoPoint: latitude - %f, longitude - %f", point.latitude, point.longitude); NSLog(@"\tmetadata:"); for (NSString *key in point.metadata.allKeys) { NSLog(@"\t\t%@ - %@", key, [point.metadata valueForKey:key]); } } } if (self->geoQuery.offset < totalPoints) { [self->geoQuery prepareNextPage]; [self loadGeoPoints]; } } errorHandler:^(Fault *fault) { NSLog(@"Error: %@", fault.message); }]; } errorHandler:^(Fault *fault) { NSLog(@"Error: %@", fault.message); }]; }
var firstResponse = true var geoQuery = BackendlessGeoQuery() geoQuery.categories = ["geoservice_sample"] geoQuery.includemetadata = true func loadGeoPoints() { Backendless.shared.geo.getPoints(geoQuery: geoQuery, responseHandler: { points in Backendless.shared.geo.getPointsCount(geoQuery: self.geoQuery, responseHandler: { totalPoints in if self.firstResponse { self.firstResponse = false print("Total points in category \(totalPoints)") } if points.count > 0 { for point in points { print("GeoPoint: latitude - \(point.latitude), longitude - \(point.longitude)") if let metadata = point.metadata { print("\tmetadata:") for key in Array(metadata.keys) { print("\t\t\(key) - \(metadata[key] ?? "")") } } } } if self.geoQuery.offset < totalPoints { self.geoQuery.prepareNextPage() self.loadGeoPoints() } }, errorHandler: { fault in print("Error: \(fault.message ?? "")") }) }, errorHandler: { fault in print("Error: \(fault.message ?? "")") }) }
const Backendless = require('backendless') /* Or use `import Backendless from 'backendless'` for client side. If you don't use npm or yarn to install modules, you can add the following line <script src="//api.backendless.com/sdk/js/latest/backendless.min.js"></script> to your index.html file and use the global Backendless variable. */ Backendless.initApp('YOUR_APP_ID', 'YOUR_JS_API_KEY') const PAGE_SIZE = 100 // max allowed value const loadGeoPoints = async () => { let offset = 0 let totalCount = 0 let lastPageSize = 0 const itemsCollection = [] do { const pageQuery = new Backendless.GeoQuery() pageQuery.categories = ['geoservice_sample'] pageQuery.includemetadata = true pageQuery.pageSize = PAGE_SIZE pageQuery.offset = offset const items = await Backendless.Geo.find(pageQuery) lastPageSize = items.length itemsCollection.push(...items) offset += PAGE_SIZE totalCount += lastPageSize } while (lastPageSize >= PAGE_SIZE) return itemsCollection } const onSuccess = points => { console.log(`Total points in category ${ points.length }`) points.forEach(point => { console.log(`GeoPoint: latitude - ${ point.latitude }, longitude - ${ point.longitude }`) console.log('Metadata:') for (let field in point.metadata) { console.log(`${ field } - ${ point.metadata[field] }`) } console.log() }) } const onError = error => { console.error('Server reported an error: ', error.message) console.error('error code: ', error.code) console.error('http status: ', error.status) } Promise.resolve() .then(loadGeoPoints) .then(onSuccess) .catch(onError)
BackendlessGeoQuery geoQuery = BackendlessGeoQuery() ..addCategory("geoservice_sample") ..includeMeta = true; Function getPoints; getPoints = () { Backendless.Geo.getPoints(query: geoQuery).then((points) { points.forEach((geoPoint) { print("GeoPoint: latitude - ${geoPoint.latitude}, longitude - ${geoPoint.longitude}"); print("\tmetadata: "); geoPoint.metadata.forEach((key, value) => print("\t\t$key - $value")); }); if (points.length == geoQuery.pageSize) { geoQuery.prepareNextPage(); getPoints(); } }); }; Backendless.Geo.getGeopointCount(geoQuery).then((count) { print("Total points in category $count"); getPoints(); });
The code produces the following output (reduced for brevity since there are 332 points in the sample data set).
Total points in category 332 GeoPoint: latitude - -37.814, longitude - 144.96332 metadata: city - MELBOURNE GeoPoint: latitude - -34.93333, longitude - 138.6 metadata: city - ADELAIDE GeoPoint: latitude - -33.86785, longitude - 151.20732 metadata: city - SYDNEY GeoPoint: latitude - -31.93333, longitude - 115.83333 metadata: city - PERTH GeoPoint: latitude - -27.48333, longitude - 153.01667 metadata: city - SOUTH BRISBANE ....
Enjoy!