Ayende @ Rahien

Refunds available at head office

Geo Location & Spatial Searches with RavenDB–Part V-Spatial Searching

So, all of this have gone quite far. We have seen that we can quite easily go from having the user’s IP address to figuring out its location using our Geo Location database.

The next step is to actually do something about it. Usually, when doing geo location, you care to know what the human readable name for the user’s location is, but in our case, what we most care about is the user’s physical location, so it is lucky that the geo location database that we found also include longitude and latitude information.

With that, we can define the following index, on our events. The Longitude & Latitude information is actually calculated by the browser using the Google Geocoder API, so we just plug in the address, and the site does the rest by figuring out where on the globe we are.

This index allows us to search by spatial query as well as by time:

image

Using that, we can do:

image

First, we try to find the location of the user based on the user IP, then we are making a spatial query on top of the events, based on the user location.

What we are doing essentially is asking, “show me the next 2 future events within 200 miles of the user’s location”. Just a tiny little bit of code, but it produces this:

image

And hopefully, this will narrow things down for you to the obvious: “Of course I am going to the next RavenDB Course”!

Tags:

Posted By: Ayende Rahien

Published at

Originally posted at

Comments

Arjen Smits
06/25/2012 07:40 AM by
Arjen Smits

What is SpatialIndex, is it part of the RavenDB framework? If so, does it also have build in support for working with the metric system? For example, what if I want to specify 200km, or 15 meters for that matter..

Ayende Rahien
06/25/2012 10:54 AM by
Ayende Rahien

Arjen, Yes, SpatialIndex is part of RavenDB. It allows you to do geo-spatial queries on the data. And in 1.2 we have metric system support as well\

Kaveh Shahbazian
06/25/2012 08:02 PM by
Kaveh Shahbazian

Is it possible to get "nearest neighbor" with RavenDB? (To be more pragmatic "nearest neighbor in a radius").

Ayende Rahien
06/26/2012 06:31 AM by
Ayende Rahien

Kaveh, You can get, "nearest from point", yes.

Kaveh Shahbazian
06/26/2012 07:50 AM by
Kaveh Shahbazian

Thanks! It would be great if you lead me to some sample code. And a question: Does this algorithm calculate spherical distance (based on spherical shape of the earth) or Cartesian distance? Because Cartesian distance is not accurate (at least for me) especially in 1/4 latitude near poles.

Ayende Rahien
06/26/2012 10:27 AM by
Ayende Rahien

Kaveh, Please ask those questions in the mailing list. The code is open and you can look at that. We use a port of sptial4j, so you can check the docs on that. Distance is done using spherical math

Comments have been closed on this topic.