Schritt 3a: Erstellen des Clientcodes für den Feature-Dienst
Für die Erstellung der SearchNearestRequest ist ein Prozess erforderlich, der mehrere Schritte umfasst, da Folgendes angegeben werden muss:
- die Geometrie zum Durchführen der Suche
- die maximale Anzahl der gewünschten Kandidaten
- der Name und der Standort der einzelnen U-Bahn-Stationen mit der jeweiligen Entfernung
- die benannte Tabelle für die Abfrage
Folgende Schritte müssen ausgeführt werden:
- Erstellen Sie eine SearchNearestRequest-Instanz und füllen Sie sie mit den gewünschten Parametern aus.
- Rufen Sie die Methode searchNearest auf, und rufen Sie SearchNearestResponse ab.
- Geben Sie die FeatureCollection über SearchNearestResponse zurück.
Der Code lautet wie folgt:
/**
* Returns a FeatureCollection of the 5 subway stations nearest the specified point.
* The specified point is assumed to be in WGS 84 (i.e. long/lat).
* @param longitude the longitude (i.e. X ordinate) of the point to search from.
* @param latitude the latitude (i.e. Y ordinate) of the point to search from.
* @return a FeatureCollection of the 5 subway stations nearest the specified point.
*/
private FeatureCollection findNearest(double longitude, double latitude) {
// create the request and populate it along the way
SearchNearestRequest request = new SearchNearestRequest();
// create the search point
Point searchPoint = new Point();
searchPoint.setSrsName("epsg:4326");
Pos pos = new Pos();
pos.setX(longitude);
pos.setY(latitude);
searchPoint.setPos(pos);
// set the search geometry which in this case is a point
request.setGeometry(searchPoint);
// we want at most 5 candidates
request.setMaxNumberOfCandidates(5);
// return the distance from the search point to each found point as an attribute called 'distance'
request.setReturnedDistanceAttributeName(DISTANCE_ATTRIBUTE_NAME);
request.setReturnedDistanceUnit(DISTANCE_UNITS);
// specify the attributes to return. in this case we want the name of the subway station and the geometry
AttributeList projectionList = new AttributeList();
projectionList.getAttributeName().add("Name");
projectionList.getAttributeName().add("Obj");
request.setAttributeList(projectionList);
// specify the Named Table to search against
NamedTable table = new NamedTable();
table.setName("/demo/stations");
request.setTable(table);
// create the client-side instance/interface to the FeatureService and specify the security settings to access the service
FeatureService featureServiceBootstrap = new FeatureService();
FeatureServiceInterface servicePort = featureServiceBootstrap.getPort(FeatureServiceInterface.class);
((BindingProvider)servicePort).getRequestContext().put(BindingProvider.USERNAME_PROPERTY, ADMIN_USERNAME);
((BindingProvider)servicePort).getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, ADMIN_PASSWORD);
// query the Feature Service and return the resulting FeatureCollection
try {
SearchNearestResponse response = servicePort.searchNearest(request);
return response.getFeatureCollection();
} catch (ServiceException e) {
throw new RuntimeException(e);
}
}