I have an assignment to find cab drivers close to a given user's
location(similar to Grab/Lyft). I have the drivers' location(latitude,
longitude) with timestamp. This data is pushed by their mobile to my server
every 2 minutes. When a user requests a ride, I need to find the nearest
driver available using the drivers' data. I'm trying to use Lucene's
GeoSpatial search for this. I've used the drivers data to be indexed and
search based on the latitude and longitude of the user. I'm also able to
search with a given latitude/longitude combination and get the nearest
driver(s) with a distance parameter. But I don't know how I can add another
parameter to the search query to specify the timestamp of the driver's data
as well. For e.g., I want to search for only drivers who are near a given
location at a particular timestamp. Can someone help me with this? Here's
the code snippet I'm using:

package com.test.trials;
import java.io.BufferedReader;import java.io.FileReader;import
java.io.IOException;import java.nio.file.Paths;
import org.apache.lucene.analysis.Analyzer;import
org.apache.lucene.analysis.standard.StandardAnalyzer;import
org.apache.lucene.document.Document;import
org.apache.lucene.document.StoredField;import
org.apache.lucene.index.DirectoryReader;import
org.apache.lucene.index.IndexWriter;import
org.apache.lucene.index.IndexWriterConfig;import
org.apache.lucene.search.IndexSearcher;import
org.apache.lucene.search.ScoreDoc;import
org.apache.lucene.search.TopDocs;import
org.apache.lucene.spatial3d.Geo3DPoint;import
org.apache.lucene.store.Directory;import
org.apache.lucene.store.FSDirectory;import
org.apache.lucene.document.LatLonPoint;
public class LuceneTrial {

    private IndexSearcher searcher;

    public static void main(String[] args) throws IOException {
        LuceneTrial trial = new LuceneTrial();
        trial.generateData();
        trial.search();
    }

    private void generateData() throws IOException {
        Directory dir = FSDirectory.open(Paths.get("C:/temp/Lucene"));
        Analyzer analyzer = new StandardAnalyzer();
        IndexWriterConfig iwc = new IndexWriterConfig(analyzer);
        iwc.setOpenMode(IndexWriterConfig.OpenMode.CREATE);
        IndexWriter writer = new IndexWriter(dir, iwc);

        try (BufferedReader br = new BufferedReader(new FileReader(
                "C:/temp/Lucene/Drivers.csv"))) {
            String line;
            String[] fieldNames = new String[] { "Driver ID",
"Latitude", "Longitude", "Time" };
            while ((line = br.readLine()) != null) {
                // process the line.
                String[] tags = line.split(",");
                Document doc = new Document();
                for (int i = 0; i < fieldNames.length; i++)
                    doc.add(new StoredField(fieldNames[i], tags[i]));

                // Add a latlon point to index
                try {
                    doc.add(new LatLonPoint("latlon", Double
                            .parseDouble(tags[1]),
Double.parseDouble(tags[2])));
                    Geo3DPoint point = new Geo3DPoint("geo3d",
                            Double.parseDouble(tags[1]),
                            Double.parseDouble(tags[2]));
                    doc.add(point);
                } catch (Exception e) {
                    System.out.println("Skipped: " + line);
                }
                writer.addDocument(doc);
            }
        }
        searcher = new IndexSearcher(DirectoryReader.open(writer));
    }

    public void search() throws IOException {
        System.out
                .println("\nLatLonQuery around given point, 10km
radius --------------------------------------");
        TopDocs docs = searcher.search(LatLonPoint.newDistanceQuery("latlon",
                6.9270790, 79.8612430, 10 * 1000), 20);
        for (ScoreDoc scoreDoc : docs.scoreDocs) {
            Document doc = searcher.doc(scoreDoc.doc);
            System.out.println(doc);
        }
    }
}


And here's the sample data I'm using:

Driver ID   Latitude    Longitude   Time1   -6.081689   145.391881
7:01:172   -5.207083   145.7887    8:32:403   -5.826789   144.295861
8:40:494   -6.569828   146.726242  8:57:335   -9.443383   147.22005
6:14:266   -3.583828   143.669186  8:13:357   61.160517   -45.425978
8:58:248   64.190922   -51.678064  7:42:169   67.016969   -50.689325
6:52:2010  76.531203   -68.703161  6:08:2111  65.659994   -18.072703
7:57:4512  65.283333   -14.401389  7:32:2313  64.295556   -15.227222
8:20:2614  65.952328   -17.425978  8:51:3415  66.058056   -23.135278
8:33:4316  63.985  -22.605556  7:39:3517  65.555833   -23.965
7:20:5418  64.13   -21.940556  7:37:4819  66.133333   -18.916667
6:46:3620  63.424303   -20.278875  7:15:1221  46.485001   -84.509445
6:14:1522  50.056389   -97.0325    7:12:1523  44.639721   -63.499444
6:15:3124  51.391944   -56.083056  7:15:5025  49.082222   -125.7725
6:52:22

Can someone show me how I can search for the drivers based on two
attributes - distance and time?

Reply via email to