package com.acuitra.location.resources;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import com.acuitra.sparql.SparqlUtils;
import com.sun.jersey.api.client.Client;
import com.yammer.metrics.annotation.Timed;
@Path("/nearby")
@Produces(MediaType.APPLICATION_JSON)
public class FindNearbyResource {
private Client jerseyClient;
private String sparqlEndpointURL;
public FindNearbyResource(Client jerseyClient, String sparqlEndpointURL) {
super();
this.jerseyClient = jerseyClient;
this.sparqlEndpointURL = sparqlEndpointURL;
}
@GET
@Timed
public String nearPoint(@QueryParam("latitude") double latitude,
@QueryParam("longitude") double longitude,
@QueryParam("distance") @DefaultValue("0.01") double distance,
@QueryParam("maxResults") @DefaultValue("5") int maxResults) {
StringBuilder builder = new StringBuilder();
builder.append("PREFIX owl: <http://www.w3.org/2002/07/owl#> ");
builder.append("PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> ");
builder.append("PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> ");
builder.append("PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> ");
builder.append("SELECT DISTINCT ?resource ?label WHERE '{' ");
builder.append(" ?resource rdfs:label ?label. ");
builder.append(" ?resource geo:lat ?targetLat. ");
builder.append(" ?resource geo:long ?targetLong. ");
builder.append(" FILTER( ");
builder.append(" \"{0,number}\"^^xsd:float - ?targetLat<= {3,number} ");
builder.append(" && ?targetLat - \"{0,number}\"^^xsd:float <= {3,number} ");
builder.append(" && \"{1,number}\"^^xsd:float - ?targetLong <= {3,number} ");
builder.append(" && ?targetLong - \"{1,number}\"^^xsd:float <= {3,number} ");
builder.append(" && lang(?label) = \"en\" ");
builder.append(" ).");
builder.append("'}' LIMIT {2,number,integer}");
String output = SparqlUtils.runQuery(jerseyClient, sparqlEndpointURL, builder.toString(), latitude, longitude, maxResults, distance);
return output;
}
}