Some of our other articles have covered what Backendless Geoservice is, how to populate a Backendless backend with sample data and how to run partial match geo searches. In this post, we will review the API for searching for geopoints in a circular shaped area or radius.
Searching for geopoints in a radius must be confined to a specific geocategory. The API will return geopoints located within the specified distance (radius) from a central point, all the points will belong to the specified category. Consider the sample code below:
BackendlessGeoQuery geoQuery = new BackendlessGeoQuery(); geoQuery.setLatitude(32.555); geoQuery.setLongitude(-97.667); geoQuery.addCategory("geoservice_sample"); geoQuery.setIncludeMeta(true); geoQuery.setRadius(270d); geoQuery.setUnits(Units.MILES); Backendless.Geo.getPoints(geoQuery, new AsyncCallback<List>() { @Override public void handleResponse(List geoPoints) { for (GeoPoint geoPoint : geoPoints) Log.i(TAG, "GeoPoint - " + geoPoint); } @Override public void handleFault(BackendlessFault fault) { Log.e(TAG, fault.getMessage()); } });
val geoQuery = BackendlessGeoQuery() geoQuery.latitude = 32.555 geoQuery.longitude = -97.667 geoQuery.addCategory("geoservice_sample") geoQuery.isIncludeMeta = true geoQuery.radius = 270.0 geoQuery.units = Units.MILES Backendless.Geo.getPoints(geoQuery, object : AsyncCallback<List> { override fun handleResponse(geoPoints: List) { for (geoPoint in geoPoints) Log.i(TAG, "GeoPoint - $geoPoint") } override fun handleFault(fault: BackendlessFault) { Log.e(TAG, fault.message) } })
BackendlessGeoQuery *geoQuery = [BackendlessGeoQuery new]; geoQuery.geoPoint = [[GeoPoint alloc] initWithLatitude:32.555 longitude:-97.667]; geoQuery.categories = @[@"geoservice_sample"]; geoQuery.includemetadata = YES; geoQuery.radius = @270; [geoQuery setUnitsWithUnits:UnitsMILES]; [Backendless.shared.geo getPointsWithGeoQuery:geoQuery responseHandler:^(NSArray *points) { for (GeoPoint *point in points) { NSLog(@"GeoPoint - %@", [point pointDescription]); } } errorHandler:^(Fault *fault) { NSLog(@"Error: %@", fault.message); }];
let geoQuery = BackendlessGeoQuery() geoQuery.geoPoint = GeoPoint(latitude: 32.555, longitude: -97.667) geoQuery.categories = ["geoservice_sample"] geoQuery.includemetadata = true geoQuery.radius = 270 geoQuery.setUnits(units: Units.MILES.rawValue) Backendless.shared.geo.getPoints(geoQuery: geoQuery, responseHandler: { points in for point in points { print("GeoPoint - \(point.pointDescription())") } }, 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 searchPoints = () => { const query = new Backendless.GeoQuery() query.latitude = 32.555 query.longitude = -97.667 query.categories = ['geoservice_sample'] query.includeMetadata = true query.radius = '270d' query.units = Backendless.Geo.UNITS.MILES return Backendless.Geo.find(query) } const onSuccess = points => { points.forEach(point => { console.log(`GeoPoint - ${JSON.stringify(point)}`) }) } 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(searchPoints) .then(onSuccess) .catch(onError)
BackendlessGeoQuery geoQuery = BackendlessGeoQuery() ..latitude = 32.555 ..longitude = -97.667 ..addCategory("geoservice_sample") ..includeMeta = true ..radius = 270.0 ..units = Units.MILES; Backendless.Geo.getPoints(query: geoQuery).then((geoPoints) { geoPoints.forEach((geoPoint) => print("GeoPoint - $geoPoint")); });
GeoPoint - GeoPoint{objectId='6CB5FECA-B2C9-3002-FFC4-17D8D069A400', latitude=32.73569, longitude=-97.10807, categories=[geoservice_sample], metadata={city=ARLINGTON}, distance=34.87} GeoPoint - GeoPoint{objectId='D60EFC78-673D-0DA8-FFD7-53C8D8BF8D00', latitude=32.78306, longitude=-96.80667, categories=[geoservice_sample], metadata={city=DALLAS}, distance=52.519} GeoPoint - GeoPoint{objectId='AD1C546F-DD65-C4B7-FFA6-57ACD06B6C00', latitude=33.15067, longitude=-96.82361, categories=[geoservice_sample], metadata={city=FRISCO}, distance=64.025} GeoPoint - GeoPoint{objectId='1905CA4C-1C4B-1156-FF2A-C505999DA300', latitude=33.01984, longitude=-96.69889, categories=[geoservice_sample], metadata={city=PLANO}, distance=64.83} GeoPoint - GeoPoint{objectId='C594A668-B9A2-4D24-FF5A-D4F700DECB00', latitude=30.26715, longitude=-97.74306, categories=[geoservice_sample], metadata={city=AUSTIN}, distance=158.313} GeoPoint - GeoPoint{objectId='3729180E-E50A-674C-FFF2-CB27C4003C00', latitude=35.46756, longitude=-97.51643, categories=[geoservice_sample], metadata={city=OKLAHOMA CITY}, distance=201.644} GeoPoint - GeoPoint{objectId='00CF08C4-6C6D-8563-FF94-5E7FFD298B00', latitude=29.42412, longitude=-98.49363, categories=[geoservice_sample], metadata={city=SAN ANTONIO}, distance=222.036} GeoPoint - GeoPoint{objectId='8C946475-BA0A-CB8B-FF46-8D6E628E2F00', latitude=29.76328, longitude=-95.36327, categories=[geoservice_sample], metadata={city=HOUSTON}, distance=236.376}
The code above works with the geoservice_sample category. This is a category created when you request Backendless to install sample geodata. While developing this sample, we used Backendless Console to verify the code results. You can perform searches in radius using the Console which visualizes the geopoints located in the circular area you get to define. Below is a screenshot from our testing:
To run searches in radius in the Console: