use of org.codice.ddf.spatial.geocoding.context.impl.NearbyLocationImpl in project ddf by codice.
the class GeoNamesWebService method getNearbyCity.
@Override
public NearbyLocation getNearbyCity(String locationWkt) {
notNull(locationWkt, "argument locationWkt may not be null");
Point wktCenterPoint = createPointFromWkt(locationWkt);
String urlStr = String.format("%s://%s/findNearbyPlaceNameJSON?lat=%f&lng=%f&maxRows=1&username=%s&cities=cities5000", GEONAMES_PROTOCOL, GEONAMES_API_ADDRESS, wktCenterPoint.getY(), wktCenterPoint.getX(), USERNAME);
Object result = query(urlStr);
if (result instanceof JSONObject) {
JSONObject jsonResult = (JSONObject) result;
JSONArray geonames = (JSONArray) jsonResult.get(GEONAMES_KEY);
if (geonames != null && geonames.size() > 0) {
JSONObject firstResult = (JSONObject) geonames.get(0);
if (firstResult != null) {
double lat = Double.valueOf((String) firstResult.get(LAT_KEY));
double lon = Double.valueOf((String) firstResult.get(LON_KEY));
String cityName = (String) firstResult.get(PLACENAME_KEY);
Point cityPoint = new PointImpl(lon, lat, SpatialContext.GEO);
return new NearbyLocationImpl(wktCenterPoint, cityPoint, cityName);
}
}
}
return null;
}
use of org.codice.ddf.spatial.geocoding.context.impl.NearbyLocationImpl in project ddf by codice.
the class GeoNamesQueryLuceneIndex method doGetNearestCities.
protected List<NearbyLocation> doGetNearestCities(final Shape shape, final int radiusInKm, final int maxResults, final Directory directory) throws GeoEntryQueryException {
notNull(shape, "GeoNamesQueryLuceneIndex.doGetNearestCities(): argument 'shape' may not be null.");
if (radiusInKm <= 0) {
throw new IllegalArgumentException("GeoNamesQueryLuceneIndex.doGetNearestCities(): radiusInKm must be positive.");
}
if (maxResults <= 0) {
throw new IllegalArgumentException("GeoNamesQueryLuceneIndex.doGetNearestCities(): maxResults must be positive.");
}
if (directory == null) {
return Collections.emptyList();
}
try (final IndexReader indexReader = createIndexReader(directory)) {
final IndexSearcher indexSearcher = createIndexSearcher(indexReader);
final List<NearbyLocation> closestCities = new ArrayList<>();
final Point center = shape.getCenter();
final Query filter = createSpatialQuery(center, radiusInKm);
// Query for all the documents in the index that are cities, then filter those
// results for the ones that are in the search area.
final BooleanQuery booleanQuery = new BooleanQuery.Builder().add(PPL_QUERY, BooleanClause.Occur.MUST).add(filter, BooleanClause.Occur.FILTER).build();
final TopDocs topDocs = indexSearcher.search(booleanQuery, maxResults, SORT);
if (topDocs.totalHits > 0) {
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
final double lat = Double.parseDouble(indexSearcher.doc(scoreDoc.doc).get(GeoNamesLuceneConstants.LATITUDE_FIELD));
final double lon = Double.parseDouble(indexSearcher.doc(scoreDoc.doc).get(GeoNamesLuceneConstants.LONGITUDE_FIELD));
final String name = indexSearcher.doc(scoreDoc.doc).get(GeoNamesLuceneConstants.NAME_FIELD);
final NearbyLocation city = new NearbyLocationImpl(center, new PointImpl(lon, lat, SPATIAL_CONTEXT), name);
closestCities.add(city);
}
}
return closestCities;
} catch (IOException e) {
throw new GeoEntryQueryException("Error reading the index", e);
}
}
use of org.codice.ddf.spatial.geocoding.context.impl.NearbyLocationImpl in project ddf by codice.
the class GazetteerQueryCatalog method transformMetacardToNearbyLocation.
private NearbyLocation transformMetacardToNearbyLocation(String location, Metacard metacard) {
String metacardLocation = getStringAttributeFromMetacard(metacard, Core.LOCATION);
String name = getStringAttributeFromMetacard(metacard, Core.TITLE);
if (StringUtils.isEmpty(metacardLocation) || StringUtils.isEmpty(name)) {
LOGGER.debug("GeoEntry metacard does not contain required attribute.");
return null;
}
Double lat;
Double lon;
PointImpl centerPoint;
try {
Geometry geometry = WKT_READER_THREAD_LOCAL.get().read(metacardLocation);
Coordinate coordinate = geometry.getCoordinate();
lat = coordinate.x;
lon = coordinate.y;
Point center = WKT_READER_THREAD_LOCAL.get().read(location).getCentroid();
centerPoint = new PointImpl(center.getY(), center.getX(), SPATIAL_CONTEXT);
} catch (org.locationtech.jts.io.ParseException e) {
LOGGER.debug("GeoEntry metacard does not contain location attribute.");
return null;
}
return new NearbyLocationImpl(centerPoint, new PointImpl(lon, lat, SPATIAL_CONTEXT), name);
}
use of org.codice.ddf.spatial.geocoding.context.impl.NearbyLocationImpl in project ddf by codice.
the class GeoNamesWebService method getNearestCities.
@Override
public List<NearbyLocation> getNearestCities(String locationWkt, int radiusInKm, int maxResults) throws java.text.ParseException, GeoEntryQueryException {
notNull(locationWkt, "argument locationWkt may not be null");
Point wktCenterPoint = createPointFromWkt(locationWkt);
String urlStr = String.format("%s://%s/findNearbyPlaceNameJSON?lat=%f&lng=%f&maxRows=%d&radius=%d&username=%s&cities=cities5000", GEONAMES_PROTOCOL, GEONAMES_API_ADDRESS, wktCenterPoint.getY(), wktCenterPoint.getX(), limitMaxRows(maxResults), radiusInKm, USERNAME);
Object result = webQuery(urlStr);
if (result instanceof JSONObject) {
JSONObject jsonResult = (JSONObject) result;
JSONArray geoNames = (JSONArray) jsonResult.get(GEONAMES_KEY);
if (geoNames != null) {
return geoNames.stream().map(JSONObject.class::cast).map(obj -> {
double lat = Double.parseDouble((String) obj.get(LAT_KEY));
double lon = Double.parseDouble((String) obj.get(LON_KEY));
String cityName = (String) obj.get(PLACENAME_KEY);
Point cityPoint = new PointImpl(lon, lat, SpatialContext.GEO);
return new NearbyLocationImpl(wktCenterPoint, cityPoint, cityName);
}).collect(toList());
}
}
return Collections.emptyList();
}
Aggregations