Mehr

GeoServer REST API-Fehler - „Der angegebene CoverageName wird nicht unterstützt“

GeoServer REST API-Fehler - „Der angegebene CoverageName wird nicht unterstützt“


Ich habe ein Problem mit GeoServer REST sowohl in 2.6.2 als auch in 2.5.4 festgestellt (allerdings interessanterweise nicht in 2.3.1).

Beim Hinzufügen eines GeoTIFF mit einem für GeoServer zugänglichen Pfad antwortet der Server mit:

Der angegebene CoverageName Resttestdemis wird nicht unterstützt

Dies passiert, wenn ich cURL verwende:

curl -X POST -d 'wahrresttestdemresttestdemEPSG:4326REPROJECT_TO_DECLARED' http://admin:[email protected]:8080/geoserver/rest/workspaces/fake_rfe2/coveragestores/testRESTStoreGeotiff/coverages.xml --header "Content-Type:application/xml" :Der angegebene CoverageName resttestdemis wird nicht unterstützt

Und auch wenn ich GeoServer Manager verwende:

08:22:15.077 [main] DEBUG httpclient.wire.header - >> "POST /geoserver/rest/workspaces/fake_rfe2/coveragestores/testRESTStoreGeotiff/coverages.xml HTTP/1.1[
][
]" 08:22 :15.079 [main] DEBUG oachttpclient.HttpMethodBase - Host-Request-Header hinzufügen 08:22:15.079 [main] DEBUG httpclient.wire.header - >> "Autorisierung: Basic YWRtaW46Z2Vvc2VydmVy[
][
]" 08:22: 15.079 [main] DEBUG httpclient.wire.header - >> "Benutzer-Agent: Jakarta Commons-HttpClient/3.1[
][
]" 08:22:15.080 [main] DEBUG httpclient.wire.header - >> "Host: localhost:8080[
][
]" 08:22:15.080 [main] DEBUG httpclient.wire.header - >> "Inhaltslänge: 213[
][
]" 08:22 :15.080 [main] DEBUG httpclient.wire.header - >> "Inhaltstyp: text/xml[
][
]" 08:22:15.080 [main] DEBUG httpclient.wire.header - >> "[ 
][
]" 08:22:15.081 [main] DEBUG httpclient.wire.content - >> "wahrresttestdemresttestdemEPSG:4326REPROJECT_TO_DECLARED" 08:22:15.081 [main] DEBUG oachmEntityEnclosingMethod - Anfragetext gesendet 08:22:15.198 [main] DEBUG httpclient.wire.header - << "HTTP/1.1 500 Internal Server Error[
][
]" 08:22:15.198 [main] DEBUG httpclient.wire.header - << "HTTP/1.1 500 Interner Serverfehler[
][
]" 08:22:15.198 [main] DEBUG httpclient.wire.header - < < "Content-Type: text/plain[
][
]" 08:22:15.198 [main] DEBUG httpclient.wire.header - << "Transfer-Encoding: chunked[
][
]" 08:22:15.198 [main] DEBUG httpclient.wire.header - << "Server: Jetty(6.1.8)[
][
]" 08:22:15.199 [main] DEBUG httpclient.wire.header - << "[
][
]" 08:22:15.199 [main] DEBUG httpclient.wire.content - << "3" 08:22:15.199 [main] DEBUG httpclient.wire.content - << " 7" 08:22:15.199 [main] DEBUG httpclient.wire.content - << "[
]" 08:22:15.199 [main] DEBUG httpclient.wire.content - << "[
]" 08: 22:15.199 [main] DEBUG httpclient.wire.content - << ":Der angegebene CoverageName resttestdemis wird nicht unterstützt" 08:22:15.200 [main] DEBUG httpclient. wire.content - << "[
]" 08:22:15.200 [main] DEBUG httpclient.wire.content - << "[
]" 08:22:15.200 [main] DEBUG httpclient.wire.content - << "0" 08:22:15.200 [main] DEBUG httpclient.wire.content - << "[
]" 08:22:15.200 [main] DEBUG httpclient.wire.content - << "[
] " 08:22:15.200 [main] DEBUG httpclient.wire.content - << "[
]" 08:22:15.200 [main] DEBUG httpclient.wire.content - << "[
]" 08:22 :15.200 [main] DEBUG httpclient.wire.header - << "[
][
]"

In diesem Fall wird der folgende Stacktrace im Serverprotokoll angezeigt:

Verursacht durch: java.lang.IllegalArgumentException: Der angegebene CoverageName resttestdem wird bei org.geotools.coverage.grid.io.AbstractGridCoverage2DReader.getCoordinateReferenceSystem(AbstractGridCoverage2DReader.java:820sCustomReader :317) bei org.geoserver.catalog.SingleGridCoverage2DReader.getCoordinateReferenceSystem(SingleGridCoverage2DReader.java:151) bei org.geoserver.catalog.CatalogBuilder.initCoverage(CatalogBuilder.java:790) bei org.resto.CoverageObject(hand.resto.CoverageRessource. CoverageResource.java:87) unter org.geoserver.rest.ReflectiveResource.handlePost(ReflectiveResource.java:121)

Betrachtet man AbstractGridCoverage2DReader.getCoordinateReferenceSystem:

/** * Ruft den {@link GeneralEnvelope} für diesen {@link AbstractGridCoverage2DReader} ab. * * @return den {@link GeneralEnvelope} für diesen {@link AbstractGridCoverage2DReader}. */ @Override public CoordinateReferenceSystem getCoordinateReferenceSystem(String CoverageName) { if (!checkName(coverageName)) { throw new IllegalArgumentException("Der angegebene CoverageName " + CoverageName + "wird nicht unterstützt"); } crs zurückgeben; }

AnscheinendcheckNamegibt false zurück, was bedeutet, dassCoverageName != this.coverageNameodercoverName == null. Hm.

Irgendwelche Ideen?

Aktualisieren:

Ich konnte das zum Laufen bringen mit:

curl -v -u admin:geoserver -XPUT -H "Inhaltstyp: text/plain" -d "file:///Users/gregederer/dev6/EWX_SAMPLE_DATA/RFE2/monthly/data.2000.03.tiff" 'http: //localhost:8080/geoserver/rest/workspaces/fake_rfe2/coveragestores/rfe2_africa_1-month-03-2000_mm_data/external.geotiff?configure=first&coverageName=rfe2_africa_1-month-03-2000_mm_data'

Gefolgt von (um den Ebenenstil zu ändern):

curl -u admin:geoserver -XPUT -H 'Inhaltstyp: Text/xml' -d 'Raster' http://localhost:8080/geoserver/rest/layers/fake_rfe2:rfe2_africa_1-month-03-2000_mm_data

Ich habe dies auch in Java mit Apache HttpComponents implementiert:

public boolean createCoverage(String-Arbeitsbereich, String-Name, String-Pfad, String-LayerStyle) { boolean erfolgreich = false; try { URI uri = new URIBuilder() .setScheme(geoServerScheme) .setHost(geoServerHost) .setPort(geoServerPort) .setPath(geoServerPath + "/rest/workspaces/" + workspace + "/coveragestores/" + name + "/external .geotiff") .setParameter("configure", "first") .setParameter("coverageName", name) .build(); StringEntity stringEntity = new StringEntity("file:///" + Pfad, ContentType.create("tex/plain", "UTF-8")); HttpPut httpPut = new HttpPut(uri); httpPut.setEntity(stringEntity); System.out.println("Anforderung wird ausgeführt" + httpPut.getRequestLine()); CloseableHttpResponse-Antwort = httpclient.execute(httpPut); erfolgreich = response.getStatusLine().getStatusCode() == 201; erfolgreich = erfolgreich && updateLayerStyle(workspace, name,layerStyle); try { System.out.println("----------------------------------------" ); System.out.println (response.getStatusLine()); } endlich { response.close(); } } catch (URISyntaxException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } endlich { versuchen { httpclient.close(); } catch (IOException e) { e.printStackTrace(); } } Rückgabe erfolgreich; } public boolean updateLayerStyle(String workspace, String layerName, String styleName) { boolean erfolgreich = false; try { URI uri = new URIBuilder() .setScheme(geoServerScheme) .setHost(geoServerHost) .setPort(geoServerPort) .setPath(geoServerPath + "/rest/layers/" + workspace + ":" + LayerName) .build(); StringEntity stringEntity = new StringEntity("" + Stilname + "", ContentType.create("application/xml", "UTF-8")); HttpPut httpPut = new HttpPut(uri); httpPut.setEntity(stringEntity); System.out.println("Executing request " + httpPut.getRequestLine ()); CloseableHttpResponse response = httpclient.execute(httpPut); erfolgreich = response.getStatusLine().getStatusCode() == 200; try { System.out.println("------------ ----------------------------"); System.out.println(response.getStatusLine()); } endlich { response.close (); } } catch (URISyntaxException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { httpclient. close(); } catch (IOException e) { e.printStackTrace(); } } return erfolgreich; }

Hoffe, dieser Workaround hilft jemandem.


Ich bin auch auf dieses Problem beim Upgrade von 2.1 auf 2.6 gestoßen.

Wir posten nativeName (Dateiname) und Name (Layer-Name) an die restliche API.

Das Problem ist, dass für >= 2.4 der CatalogBuilder über . aufgerufen wird

coverage = builder.buildCoverage(name);

Innerhalb dieser Methode gibt es also keine Möglichkeit, zwischen name und nativeName zu unterscheiden.

Wenn Sie dies selbst beheben möchten und nichts dagegen haben, GeoServer selbst zu erstellen, können Sie Folgendes in CoverageResource.handleObjectPost tun (ohne die Signaturen zu ändern):

// Code weggelassen… String name = cover.getName(); String nativeName = cover.getNativeName(); CatalogBuilder builder = new CatalogBuilder(Katalog); CoverageStoreInfo-Speicher = Coverage.getStore(); builder.setStore (Speicher); // Wir behandeln hier 2 verschiedene Fälle if (!isNew) { // Konfigurieren eines teilweise definierten Coverages builder.initCoverage(coverage, name); } else { // Ein brandneues Coverage konfigurieren (nur Name wurde angegeben) cover = builder.buildCoverage(nativeName); cover.setName(name); } // Code weggelassen…

Wir setzen name und nativeName immer über XML, daher trifft dies nicht auf uns zu, aber es könnte gut sein, auf Nullwerte zu prüfen, so etwas wie CatalogBuilder.initResourceInfo ...