GeoservePlacesService.java
package gov.usgs.earthquake.geoserve;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import javax.json.Json;
import javax.json.JsonArray;
import javax.json.JsonObject;
import javax.json.JsonReader;
import gov.usgs.util.StreamUtils;
/**
* Access places from the Geoserve Places service.
*/
public class GeoservePlacesService {
/** Default URL for GeoServe Places service. */
public static final String DEFAULT_ENDPOINT_URL = "https://earthquake.usgs.gov/ws/geoserve/places.json";
/** Default connection timeout */
public static final int DEFAULT_CONNECT_TIMEOUT = 300; // ms
/** Default read timeout */
public static final int DEFAULT_READ_TIMEOUT = 1700; // ms
/** Configured URL for GeoServe Places service. */
private String endpointUrl;
private int connectTimeout;
private int readTimeout;
/** Default constructor */
public GeoservePlacesService() {
this(DEFAULT_ENDPOINT_URL, DEFAULT_CONNECT_TIMEOUT, DEFAULT_READ_TIMEOUT);
}
/**
* Constructor taking in endpointURL
* @param endpointUrl for places service
*/
public GeoservePlacesService(final String endpointUrl) {
this(endpointUrl, DEFAULT_CONNECT_TIMEOUT, DEFAULT_READ_TIMEOUT);
}
/**
* Constructor taking in timeouts and using default endpoint URL
* @param connectTimeout in ms
* @param readTimeout in ms
*/
public GeoservePlacesService(final int connectTimeout, final int readTimeout) {
this(DEFAULT_ENDPOINT_URL, connectTimeout, readTimeout);
}
/**
* Custom constructor
* @param endpointUrl for Places service
* @param connectTimeout in ms
* @param readTimeout in ms
*/
public GeoservePlacesService(final String endpointUrl, final int connectTimeout, final int readTimeout) {
this.setEndpointURL(endpointUrl);
this.setConnectTimeout(connectTimeout);
this.setReadTimeout(readTimeout);
}
/** @return connectTimemout */
public int getConnectTimeout() {
return this.connectTimeout;
}
/** @return endpointURL */
public String getEndpointURL() {
return this.endpointUrl;
}
/**
* Find an event in the Places service via a latitude and longitude
* @param latitude of event
* @param longitude of event
* @return JSONObject of event
* @throws IOException on IO error
* @throws MalformedURLException or URL error
*/
public JsonObject getEventPlaces(BigDecimal latitude, BigDecimal longitude)
throws IOException, MalformedURLException {
final URL url = new URL(this.endpointUrl +
"?type=event" +
"&latitude=" + URLEncoder.encode(latitude.toString(), StandardCharsets.UTF_8.toString()) +
"&longitude=" + URLEncoder.encode(longitude.toString(), StandardCharsets.UTF_8.toString())
);
try (InputStream in = StreamUtils.getURLInputStream(url, this.connectTimeout, this.readTimeout)) {
JsonReader reader = Json.createReader(in);
JsonObject json = reader.readObject();
reader.close();
return json.getJsonObject("event");
}
}
/**
* Get nearest place to a latitude and longitude
* @param latitude of place
* @param longitude of place
* @return JSONObject of place
* @throws IndexOutOfBoundsException on no places returned
* @throws IOException on IO error
* @throws MalformedURLException on URL error
* @deprecated
*/
public JsonObject getNearestPlace(BigDecimal latitude, BigDecimal longitude)
throws IndexOutOfBoundsException, IOException, MalformedURLException {
return this.getNearestPlace(latitude, longitude, 300);
}
/**
* Get nearest place to a latitude and longitude
* @param latitude of place
* @param longitude of place
* @param maxradiuskm around place
* @return JSONObject of place
* @throws IOException on IO error
* @throws MalformedURLException on URL error
*/
public JsonObject getNearestPlace(BigDecimal latitude, BigDecimal longitude,
int maxradiuskm) throws IOException, MalformedURLException {
final URL url = new URL(this.endpointUrl +
"?type=geonames" +
"&latitude=" + URLEncoder.encode(latitude.toString(), StandardCharsets.UTF_8.toString()) +
"&longitude=" + URLEncoder.encode(longitude.toString(), StandardCharsets.UTF_8.toString()) +
"&maxradiuskm=" + URLEncoder.encode(String.valueOf(maxradiuskm), StandardCharsets.UTF_8.toString()) +
"&limit=1"
);
try (
InputStream in = StreamUtils.getURLInputStream(url, this.connectTimeout, this.readTimeout);
JsonReader reader = Json.createReader(in)
) {
JsonObject json = reader.readObject();
JsonObject places = json.getJsonObject("geonames");
JsonArray features = places.getJsonArray("features");
if (features.size() > 0) {
return features.getJsonObject(0);
} else {
return null;
}
}
}
/** @return readTimeout */
public int getReadTimeout() {
return this.readTimeout;
}
/** @param connectTimeout int to set */
public void setConnectTimeout(final int connectTimeout) {
this.connectTimeout = connectTimeout;
}
/** @param endpointUrl string to set */
public void setEndpointURL(final String endpointUrl) {
this.endpointUrl = endpointUrl;
}
/** @param readTimeout int to set */
public void setReadTimeout(final int readTimeout) {
this.readTimeout = readTimeout;
}
// as needed, implement full GeoServe places API options
}