Geo Library for Amazon DynamoDB – Part 4: Put Geo Point
In this post, I’m going to show you how to put a Geo point into an Amazon DynamoDB table using the Geo Library. In order to put a Geo point, you need to first set up
GeoDataManager, and an Amazon DynamoDB table. Please read GeoDataManagerConfiguration and Creating Amazon DynamoDB Tables for the details.
First, you need to create an instance of
GeoPoint, which is a latitude and longitude pair representing a Geo point on the earth.
double latitude = 47.61121; double longitude = -122.31846; GeoPoint geoPoint = new GeoPoint(latitude, longitude);
Creating a Range Key AttributeValue
The range key is a user-generated value that uniquely identifies the item in a DynamoDB table. We need to create an instance of
AttributeValue for the range key by calling the following:
AttributeValue rangeKeyValue = new AttributeValue().withS("your-unique-range-key-value");
Note that the range key data type has to match with the data type of your DynamoDB table range key. If the data type of your range key is
Number, you can create
AttributeValue as follows:
AttributeValue rangeKeyValue = new AttributeValue().withN("0123456789");
Once you have an instance of
GeoPoint that represents the Geo location and an instance of
AttributeValue that uniquely identifies the Geo point, you can create
PutPointRequest putPointRequest = new PutPointRequest(geoPoint, rangeKeyValue);
Putting a Geo point
You can simply call
putPoint on an instance of
GeoDataManager geoDataManager = // Instantiate GeoDataManager double latitude = 47.61121; double longitude = -122.31846; GeoPoint geoPoint = new GeoPoint(latitude, longitude); AttributeValue rangeKeyValue = new AttributeValue().withS("unique-range-key-value"); PutPointRequest putPointRequest = new PutPointRequest(geoPoint, rangeKeyValue); PutPointResult putPointResult = geoDataManager.putPoint(putPointRequest);
Adding additional attributes
In addition to the geo-location information that
GeoPoint represents, items on the DynamoDB tables can have your own custom attributes. For example, you may want to store a school name and zip code along with the school location.
You can do this by customizing
PutPointRequest internally has an instance of
PutItemRequest, which is defined in the AWS SDK for Java and is used by the Geo Library to put a DynamoDB item into a table. You have access to this low-level object once you construct
PutPointRequest, and you can modify it as follows in order to add your custom attributes:
… PutPointRequest putPointRequest = new PutPointRequest(geoPoint, rangeKeyValue); AttributeValue schoolNameValue = new AttributeValue().withS("Custom School Name"); AttributeValue schoolZipValue = new AttributeValue().withN("98765"); PutItemRequest putItemRequest = putPointRequest.getPutItemRequest(); putItemRequest.addItemEntry("schoolName", schoolNameValue); putItemRequest.addItemEntry("schoolZip", schoolZipValue); PutPointResult putPointResult = geoDataManager.putPoint(putPointRequest);
The above code adds the following two custom attributes:
|Attribute Name||Attribute Data Type||Attribute Value|
|schoolName||String||Custom School Name|
You can further customize
PutItemRequest to perform additional tasks. For instance, you can tell
PutItemRequest to retrieve Write Capacity Units consumed by the Put request:
PutItemRequest putItemRequest = putPointRequest.getPutItemRequest(); putItemRequest.setReturnConsumedCapacity(ReturnConsumedCapacity.TOTAL); PutPointResult putPointResult = geoDataManager.putPoint(putPointRequest); PutItemResult putItemResult = putPointResult.getPutItemResult(); double consumedCapacity = putItemResult.getConsumedCapacity().getCapacityUnits();
PutItemResult, and you can retrieve consumed Write Capacity Units easily.
Please read PutItemRequest API Reference and PutItemResult API Reference for the full list of customizable fields. Please note that the table name and hash key, geohash, and geoJson attribute are not customizable and will be overwritten by GeoDataManagerConfiguration values. Also, once put these four values are not modifiable. In order to update these fields, you need to delete the Geo point and put a new point.
As always, please leave a comment below if you have questions.