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:

  1. Erstellen Sie eine SearchNearestRequest-Instanz und füllen Sie sie mit den gewünschten Parametern aus.
  2. Rufen Sie die Methode searchNearest auf, und rufen Sie SearchNearestResponse ab.
  3. 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);
    }
}