How to Load Data Objects With Related Geopoints Using API

by on September 1, 2019

In other articles, we have covered:

Of course, both of the operations above can also be accomplished with the API. In this post, we are going to show how to retrieve a data object that has a related geopoint.

Consider the following object:

The Address table has the location column of the GEOPOINT RELATIONSHIP type. There are three data objects in the table and one of them has a related geopoint. The geopoint is shown in the screenshot below.

Notice the geopoint’s metadata (city: NEW YORK CITY ):

The following code retrieves Address objects using an SQL query. Additionally, the query options include a request for the related “location” property. As a result, when the server returns the Address objects, they will have the location property pre-initialized. This approach is described in greater detail in the “Loading related data objects – the ‘one-step/dynamic’ approach” article:

    An object from the Address table should be an instance of the following class.

    The package name is irrelevant – it can be anything; however, what’s important is that the location column from the table is represented through the com.backendless.geo.GeoPoint class:

    import com.backendless.geo.GeoPoint;
    public class Address {
       public String street;
       public String city;
       public GeoPoint location;

    Code to retrieve data:

    DataQueryBuilder dataQuery = DataQueryBuilder.create();
    dataQuery.setWhereClause(" = 'NEW YORK CITY'");
    Backendless.Data.of(Address.class).find(dataQuery, new AsyncCallback<List<Address>>() {
       public void handleResponse(List<Address> nycPeople) {
           for (Address address : nycPeople) {
               Log.i(TAG, "City - " +;
               Log.i(TAG, "Location (Geo Point) - " + address.location);
       public void handleFault(BackendlessFault fault) {
           Log.e(TAG, fault.getMessage());

    import com.backendless.geo.GeoPoint
    data class Address(var street: String? = null, var city: String? = null, var location: GeoPoint? = null)

    Code to retrieve data:

    val dataQuery = DataQueryBuilder.create()
    dataQuery.whereClause = " = 'NEW YORK CITY'"
    Backendless.Data.of(, object : AsyncCallback<List<Address>> {
       override fun handleResponse(nycPeople: List<Address>) {
           for (address in nycPeople) {
               Log.i(TAG, "City - ${}")
               Log.i(TAG, "Location (Geo Point) - ${address.location}")
       override fun handleFault(fault: BackendlessFault) {
           Log.e(TAG, fault.message)

    @interface Address : NSObject
    @property (strong, nonatomic) NSString *objectId;
    @property (strong, nonatomic) NSString *city;
    @property (strong, nonatomic) NSString *street;
    @property (strong, nonatomic) GeoPoint *location;

    Code to retrieve data:

    DataQueryBuilder *queryBuilder = [DataQueryBuilder new];
    [queryBuilder setWhereClauseWithWhereClause:@" = 'NEW YORK CITY'"];
    [queryBuilder setRelatedWithRelated:@[@"location"]];
    [[ of:[Address class]] findWithQueryBuilder:queryBuilder responseHandler:^(NSArray *addresses) {
        for (Address *address in addresses) {
            NSLog(@"City - %@",;
            NSLog(@"Location (Geo Point) - %@", address.location);
    } errorHandler:^(Fault *fault) {
        NSLog(@"Error: %@", fault.message);

    @objcMembers class Address: NSObject {
        var objectId: String?
        var city: String?
        var street: String?
        var location: GeoPoint?

    Code to retrieve data:

    let queryBuilder = DataQueryBuilder()
    queryBuilder.setWhereClause(whereClause: " = 'NEW YORK CITY'")
    queryBuilder.setRelated(related: ["location"])
        queryBuilder, responseHandler: { addresses in
        if let addresses = addresses as? [Address] {
            for address in addresses {
                print("City - \( ?? "")")
                print("Location (Geo Point) - \(address.location ?? GeoPoint())")
    }, 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="//"></script>
     to your index.html file and use the global Backendless variable.
    Backendless.initApp('YOUR_APP_ID', 'YOUR_JS_API_KEY')
    const loadAddresses = () => {
      const query = Backendless.DataQueryBuilder.create()
      query.setWhereClause(' = \'NEW YORK CITY\'')
      return Backendless.Data.of('Address').find(query)
    const onSuccess = addresses => {
      addresses.forEach(address => {
        console.log(`City - ${ }`)
        console.log(`Location (Geo Point) - ${ JSON.stringify(address.location) }`)
    const onError = error => {
      console.error('Server reported an error: ', error.message)
      console.error('error code: ', error.code)
      console.error('http status: ', error.status)

    DataQueryBuilder dataQuery = DataQueryBuilder();
    dataQuery.whereClause = " = 'NEW YORK CITY'";
    dataQuery.related = ["location"];
    Backendless.Data.of("Address").find(dataQuery).then((nycPeople) {
     nycPeople.forEach((address) {
       print("City - ${address['city']}");
       print("Location (Geo Point) - ${address['location']}");

    The program output is:

    City - New York
    Location (Geo Point) - GeoPoint{objectId='2C2487C9-AAC5-1F57-FFFE-6BD608C79800', latitude=40.71427, longitude=-74.00597, categories=[geoservice_sample], metadata={city=NEW YORK CITY}, distance=null}

    Leave a Reply