Saturday, May 7, 2016

Proximity alert for locations saved at server

Leave a Comment

I did some search but could not find a suitable answer.

My App should compare with multiple locations for proximity. This means I will not be able to save all the locations into my app to confirm the proximity using locationManager. I want the proximity confirmation to be done in the server

What would be the best way to implement this?

Would it be sensible if the app asks for proximity confirmation every time the devices moves around?

4 Answers

Answers 1

I would try a different approach, since location updates from GPS are made once per second, and I don't think it's a good idea to ask the server each second for proximity if you have a large amount of devices.
Think of this idea -

  1. Get the device's initial location and send it to the server.
  2. Decide on a sensible radius that the device will stay within it for the next 5-10 minutes. Also make sure that you don't have "too many" points in that radius, or you can narrow the radius in that case. It's up to you to decide the radius and the number of points, depending on your usage, number of points etc.
  3. Send form the server all the locations within that radius to the device.
  4. Let the device calculate the proximity by itself.
  5. When the device moves out of the initial radius - update the server and get the new relevant locations. This can be done easily - call the radius r. Save the initial location of the device, and calculate the distance between the current and initail location. When it is "close enough" to r - update the server.

Answers 2

In your case, simply, you can send the received locations to your server and then make required calculations on server. But don't forget that you will be dealing with those questions

  • How many devices send location to server ?
  • How frequently each device send location to server ?

Also the responsibility of detecting a device has entered an area on the server

I think you can reduce the complexity of the all things by using geofencing api, link

  • No need to send each location to server.
  • Each device individually detects itself has entered or exited an area.

EDIT

Otherwise you will be doing entered/exited calculations on server for unlimited count of device, whenever each device's location has changed.

Before we were doing similar thing in my previous company, calculating enter/exit time and enter durations. but via real gps devices on buses

  • We have almost 100 points(geofence) in city. So you can think that those points are on a few routes

  • Each gps device on bus is sending location to server periodically.

  • When the bus has finished it's route, server reviews device's all received locations on the route.

  • Compares each geofence with each location of bus.

This is the real scenario. You can call it "server based geofencing".

Answers 3

You could do a simple k-d tree implementation on the server side to store the coordinates.

Send the coordinates of the device over, which can be determined at whatever interval you need. If it's every 5 seconds, or 10 seconds it doesn't really matter. This will mainly be decided by the minimum distance between each of the coordinates/radius. If they're closer, you may need to update it more frequently.

Using the k-d tree finding the nearest neighbor would be O(log(n)). However, you make a slight modification where you can start adding the nodes to a list as long as they are within the certain radius of your device coordinates. In fact if you store it locally as a k-d tree as well then you can pick the furthest nodes in O(log(n))

Now on the second update when the device location is sent again, you can quickly update it since you have the existing locations. Say you move in the x direction by 5. You can drop the points that are now outside of the radius at x - 5. The new proximity, you do the same nearest neighbor search, adding in nodes as they're within the radius, but this time starting with the cached nodes closest to the direction you are moving in.

Combining that with an interval tree for radiuses. So say 0 to 1, 1 to 2, 2 to 3, as your intervals. You can pick out everything within a certain radius in O(log(n)) time as well. Those should be pointers to nodes in the k-d tree. That would simplify the radius calculations and finding the location if you're willing to sacrifice some memory for efficiency.

Answers 4

For a "fast" way to implement it on the server side you can use the mondodb $near geospatial query.

https://docs.mongodb.org/manual/reference/operator/query/near/

While on the mobile side you can use the minDistance property for the location updates. You can set it to a reasonable distance 20m/50m depending on the average distance between your locations.

http://developer.android.com/reference/android/location/LocationManager.html#requestLocationUpdates(java.lang.String,%20long,%20float,%20android.location.LocationListener)

If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment