@Test public void NetCDFProjectedEnvelopeTest() throws NoSuchAuthorityCodeException, FactoryException, IOException, ParseException { File mosaic = new File(TestData.file(this, "."), "NetCDFProjection"); if (mosaic.exists()) { FileUtils.deleteDirectory(mosaic); } assertTrue(mosaic.mkdirs()); File file = TestData.file(this, "wind.nc"); FileUtils.copyFileToDirectory(file, mosaic); file = new File(mosaic, "wind.nc"); // Get format final NetCDFReader reader = new NetCDFReader(file, null); try { String[] names = reader.getGridCoverageNames(); String coverageName = names[0]; // subsetting the envelope final ParameterValue<GridGeometry2D> gg = AbstractGridFormat.READ_GRIDGEOMETRY2D.createValue(); final GeneralEnvelope originalEnvelope = reader.getOriginalEnvelope(coverageName); final CoordinateReferenceSystem epsg3857 = CRS.decode("EPSG:3857", true); final GeneralEnvelope projectedEnvelope = CRS.transform(originalEnvelope, epsg3857); gg.setValue( new GridGeometry2D(new GridEnvelope2D(new Rectangle(0, 0, 30, 30)), projectedEnvelope)); GeneralParameterValue[] values = new GeneralParameterValue[] {gg}; GridCoverage2D coverage = reader.read(coverageName, values); // reader doesn't perform reprojection. It simply transforms reprojected envelope // to native envelope so BBOX and CRS should be wgs84 CoordinateReferenceSystem coverageCRS = coverage.getCoordinateReferenceSystem(); final int code = CRS.lookupEpsgCode(coverageCRS, false); assertEquals(4326, code); Extent extent = coverageCRS.getDomainOfValidity(); Collection<? extends GeographicExtent> geoElements = extent.getGeographicElements(); GeographicExtent geographicExtent = geoElements.iterator().next(); GeographicBoundingBoxImpl impl = (GeographicBoundingBoxImpl) geographicExtent; // Getting the coverage Envelope for coordinates check Envelope coverageEnvelope = coverage.getEnvelope(); assertTrue(impl.getEastBoundLongitude() >= coverageEnvelope.getMaximum(0)); assertTrue(impl.getWestBoundLongitude() <= coverageEnvelope.getMinimum(0)); assertTrue(impl.getNorthBoundLatitude() >= coverageEnvelope.getMaximum(1)); assertTrue(impl.getSouthBoundLatitude() <= coverageEnvelope.getMinimum(1)); } catch (Throwable t) { throw new RuntimeException(t); } finally { if (reader != null) { try { reader.dispose(); } catch (Throwable t) { // Does nothing } } } }
/** * Test simple Record Marshalling. * * @throws java.lang.Exception */ @Test public void inpsireExtensionUnmarshallingTest() throws Exception { String xml = "<wms:Capability xmlns:wms=\"http://www.opengis.net/wms\" xmlns:gml=\"http://www.opengis.net/gml/3.2\" xmlns:gmd=\"http://www.isotc211.org/2005/gmd\" xmlns:srv=\"http://www.isotc211.org/2005/srv\" xmlns:gco=\"http://www.isotc211.org/2005/gco\" xmlns:sld=\"http://www.opengis.net/sld\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:inspire_vs=\"http://inspira.europa.eu/networkservice/view/1.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" + '\n' + " <inspire_vs:ExtendedCapabilities>" + '\n' + " <inspire_vs:Resourcelocator>" + '\n' + " <gmd:linkage>" + '\n' + " <gmd:URL>http://javacestpasdlamenthealeau.com</gmd:URL>" + '\n' + " </gmd:linkage>" + '\n' + " </inspire_vs:Resourcelocator>" + '\n' + " <inspire_vs:MetadataUrl>" + '\n' + " <gmd:linkage>" + '\n' + " <gmd:URL>http://javacestdurocknroll.com</gmd:URL>" + '\n' + " </gmd:linkage>" + '\n' + " </inspire_vs:MetadataUrl>" + '\n' + " <inspire_vs:ResourceType>" + '\n' + " <gmd:MD_ScopeCode codeList=\"http://schemas.opengis.net/iso/19139/20070417/resources/Codelist/gmxCodelists.xml#MD_ScopeCode\" codeListValue=\"service\"/>" + '\n' + " </inspire_vs:ResourceType>" + '\n' + " <inspire_vs:TemporalRefererence>" + '\n' + " <gmd:EX_Extent>" + '\n' + " <gmd:temporalElement>" + '\n' + " <gmd:EX_TemporalExtent>" + '\n' + " <gmd:extent>" + '\n' + " <gml:TimePeriod>" + '\n' + " <gml:beginPosition>1970-01-02T10:20:00+01:00</gml:beginPosition>" + '\n' + " <gml:endPosition>1970-01-02T10:20:01.000+01:00</gml:endPosition>" + '\n' + " </gml:TimePeriod>" + '\n' + " </gmd:extent>" + '\n' + " </gmd:EX_TemporalExtent>" + '\n' + " </gmd:temporalElement>" + '\n' + " </gmd:EX_Extent>" + '\n' + " </inspire_vs:TemporalRefererence>" + '\n' + " <inspire_vs:Conformity>" + '\n' + " <gmd:DQ_ConformanceResult>" + '\n' + " <gmd:specification>" + '\n' + " <gmd:CI_Citation>" + '\n' + " <gmd:title>" + '\n' + " <gco:CharacterString>European Petroleum Survey Group</gco:CharacterString>" + '\n' + " </gmd:title>" + '\n' + " <gmd:alternateTitle>" + '\n' + " <gco:CharacterString>EPSG</gco:CharacterString>" + '\n' + " </gmd:alternateTitle>" + '\n' + " <gmd:identifier>" + '\n' + " <gmd:MD_Identifier>" + '\n' + " <gmd:code>" + '\n' + " <gco:CharacterString>EPSG</gco:CharacterString>" + '\n' + " </gmd:code>" + '\n' + " </gmd:MD_Identifier>" + '\n' + " </gmd:identifier>" + '\n' + " <gmd:citedResponsibleParty>" + '\n' + " <gmd:CI_ResponsibleParty>" + '\n' + " <gmd:organisationName>" + '\n' + " <gco:CharacterString>European Petroleum Survey Group</gco:CharacterString>" + '\n' + " </gmd:organisationName>" + '\n' + " <gmd:contactInfo>" + '\n' + " <gmd:CI_Contact>" + '\n' + " <gmd:onlineResource>" + '\n' + " <gmd:CI_OnlineResource>" + '\n' + " <gmd:linkage>" + '\n' + " <gmd:URL>http://www.epsg.org</gmd:URL>" + '\n' + " </gmd:linkage>" + '\n' + " <gmd:function>" + '\n' + " <gmd:CI_OnLineFunctionCode codeList=\"http://schemas.opengis.net/iso/19139/20070417/resources/Codelist/gmxCodelists.xml#CI_OnLineFunctionCode\" codeListValue=\"information\"/>" + '\n' + " </gmd:function>" + '\n' + " </gmd:CI_OnlineResource>" + '\n' + " </gmd:onlineResource>" + '\n' + " </gmd:CI_Contact>" + '\n' + " </gmd:contactInfo>" + '\n' + " <gmd:role>" + '\n' + " <gmd:CI_RoleCode codeList=\"http://schemas.opengis.net/iso/19139/20070417/resources/Codelist/gmxCodelists.xml#CI_RoleCode\" codeListValue=\"principalInvestigator\"/>" + '\n' + " </gmd:role>" + '\n' + " </gmd:CI_ResponsibleParty>" + '\n' + " </gmd:citedResponsibleParty>" + '\n' + " <gmd:presentationForm>" + '\n' + " <gmd:CI_PresentationFormCode codeList=\"http://schemas.opengis.net/iso/19139/20070417/resources/Codelist/gmxCodelists.xml#CI_PresentationFormCode\" codeListValue=\"tableDigital\"/>" + '\n' + " </gmd:presentationForm>" + '\n' + " </gmd:CI_Citation>" + '\n' + " </gmd:specification>" + '\n' + " <gmd:explanation>" + '\n' + " <gco:CharacterString>see the referenced specification</gco:CharacterString>" + '\n' + " </gmd:explanation>" + '\n' + " <gmd:pass>" + '\n' + " <gco:Boolean>true</gco:Boolean>" + '\n' + " </gmd:pass>" + '\n' + " </gmd:DQ_ConformanceResult>" + '\n' + " </inspire_vs:Conformity>" + '\n' + " <inspire_vs:MetadataPointOfContact>" + '\n' + " <gmd:CI_ResponsibleParty>" + '\n' + " <gmd:organisationName>" + '\n' + " <gco:CharacterString>European Petroleum Survey Group</gco:CharacterString>" + '\n' + " </gmd:organisationName>" + '\n' + " <gmd:contactInfo>" + '\n' + " <gmd:CI_Contact>" + '\n' + " <gmd:onlineResource>" + '\n' + " <gmd:CI_OnlineResource>" + '\n' + " <gmd:linkage>" + '\n' + " <gmd:URL>http://www.epsg.org</gmd:URL>" + '\n' + " </gmd:linkage>" + '\n' + " <gmd:function>" + '\n' + " <gmd:CI_OnLineFunctionCode codeList=\"http://schemas.opengis.net/iso/19139/20070417/resources/Codelist/gmxCodelists.xml#CI_OnLineFunctionCode\" codeListValue=\"information\"/>" + '\n' + " </gmd:function>" + '\n' + " </gmd:CI_OnlineResource>" + '\n' + " </gmd:onlineResource>" + '\n' + " </gmd:CI_Contact>" + '\n' + " </gmd:contactInfo>" + '\n' + " <gmd:role>" + '\n' + " <gmd:CI_RoleCode codeList=\"http://schemas.opengis.net/iso/19139/20070417/resources/Codelist/gmxCodelists.xml#CI_RoleCode\" codeListValue=\"principalInvestigator\"/>" + '\n' + " </gmd:role>" + '\n' + " </gmd:CI_ResponsibleParty>" + '\n' + " </inspire_vs:MetadataPointOfContact>" + '\n' + " <inspire_vs:MetadataDate>" + '\n' + " <gco:Date>1970-01-02</gco:Date>" + '\n' + " </inspire_vs:MetadataDate>" + '\n' + " <inspire_vs:SpatialDataService>" + '\n' + " <srv:serviceType>" + '\n' + " <gco:LocalName>view</gco:LocalName>" + '\n' + " </srv:serviceType>" + '\n' + " </inspire_vs:SpatialDataService>" + '\n' + " <inspire_vs:InpireKeywords>" + '\n' + " <gmd:keyword>" + '\n' + " <gco:CharacterString>something</gco:CharacterString>" + '\n' + " </gmd:keyword>" + '\n' + " </inspire_vs:InpireKeywords>" + '\n' + " <inspire_vs:Languages>" + '\n' + " <inspire_vs:Language>FR</inspire_vs:Language>" + '\n' + " <inspire_vs:Language default=\"true\">EN</inspire_vs:Language>" + '\n' + " </inspire_vs:Languages>" + '\n' + " <inspire_vs:currentLanguage>FR</inspire_vs:currentLanguage>" + '\n' + " </inspire_vs:ExtendedCapabilities>" + '\n' + "</wms:Capability>" + '\n'; ExtendedCapabilitiesType ext = new ExtendedCapabilitiesType(); NameFactory nameFactory = new DefaultNameFactory(); ObjectFactory factory = new ObjectFactory(); ext.setResourceType(ScopeCode.SERVICE); ext.setSpatialDataService(new ServiceType(nameFactory.createLocalName(null, "view"))); ext.setResourcelocator( new DefaultOnlineResource(URI.create("http://javacestpasdlamenthealeau.com"))); ext.setMetadataUrl(new DefaultOnlineResource(URI.create("http://javacestdurocknroll.com"))); DefaultExtent extent = new DefaultExtent(); DefaultTemporalExtent tempExt = new DefaultTemporalExtent(); NamedIdentifier periodName = new NamedIdentifier(Citations.CRS, "period"); final Map<String, Object> periodProp = new HashMap<>(); periodProp.put(IdentifiedObject.NAME_KEY, periodName); NamedIdentifier instantName = new NamedIdentifier(Citations.CRS, "period instant"); final Map<String, Object> properties = new HashMap<>(); properties.put(IdentifiedObject.NAME_KEY, instantName); DefaultPeriod period = new DefaultPeriod( periodProp, new DefaultInstant(properties, new Date(120000000)), new DefaultInstant(properties, new Date(120001000))); tempExt.setExtent(period); extent.setTemporalElements(Arrays.asList(tempExt)); ext.setTemporalRefererence(extent); DefaultResponsibleParty rp = new DefaultResponsibleParty(Role.PRINCIPAL_INVESTIGATOR); rp.setOrganisationName(new SimpleInternationalString("European Petroleum Survey Group")); DefaultOnlineResource or = new DefaultOnlineResource(URI.create("http://www.epsg.org")); or.setFunction(OnLineFunction.INFORMATION); DefaultContact ct = new DefaultContact(or); rp.setContactInfo(ct); DefaultCitation citation = new DefaultCitation(); citation.setCitedResponsibleParties(Arrays.asList(rp)); citation.setTitle(rp.getOrganisationName()); citation.setAlternateTitles(Arrays.asList(new SimpleInternationalString("EPSG"))); citation.setIdentifiers(Arrays.asList(new DefaultIdentifier("EPSG"))); citation.setPresentationForms(Arrays.asList(PresentationForm.TABLE_DIGITAL)); DefaultConformanceResult cresult = new DefaultConformanceResult( citation, new DefaultInternationalString("see the referenced specification"), true); ext.setConformity(cresult); ResponsibleParty party = DefaultResponsibleParty.castOrCopy( Citations.EPSG.getCitedResponsibleParties().iterator().next()); ext.setMetadataPointOfContact(party); ext.setMetadataDate(new Date(82800000)); DefaultKeywords key = new DefaultKeywords(new SimpleInternationalString("something")); ext.setInpireKeywords(key); List<LanguageType> langs = new ArrayList<>(); langs.add(new LanguageType("FR")); langs.add(new LanguageType("EN", true)); LanguagesType languages = new LanguagesType(langs); ext.setLanguages(languages); ext.setCurrentLanguage("FR"); JAXBElement<ExtendedCapabilitiesType> jbExtendedCap = factory.createExtendedCapabilities(ext); Capability expResult = new Capability(null, null, null, jbExtendedCap); final Object unmarshalled = unmarshaller.unmarshal(new StringReader(xml)); assertNotNull(unmarshalled); assertTrue(unmarshalled instanceof Capability); Capability result = (Capability) unmarshalled; // The Unmarshaller replaced automatically the DefaultInternationalString by a // SimpleInternationalString because it detected that there is only one locale. // Perform the same change in our expected result in order to allow comparison. cresult.setExplanation(new SimpleInternationalString(cresult.getExplanation().toString())); final ExtendedCapabilitiesType expCapabilities = expResult.getInspireExtendedCapabilities(); final ExtendedCapabilitiesType capabilities = result.getInspireExtendedCapabilities(); final ConformanceResult expConformity = expCapabilities.getConformity(); final ConformanceResult conformity = capabilities.getConformity(); final Citation expSpecification = expConformity.getSpecification(); final Citation specification = conformity.getSpecification(); final Extent expTemporal = expCapabilities.getTemporalRefererence(); final Extent temporal = capabilities.getTemporalRefererence(); final TemporalExtent expTemporalExtent = getSingleton(expTemporal.getTemporalElements()); final TemporalExtent temporalExtent = getSingleton(temporal.getTemporalElements()); final Period expExtentPeriod = (Period) expTemporalExtent.getExtent(); final Period extentPeriod = (Period) temporalExtent.getExtent(); assertEquals(expConformity.getExplanation().toString(), conformity.getExplanation().toString()); assertEquals(expSpecification.getCollectiveTitle(), specification.getCollectiveTitle()); assertEquals( expSpecification.getCitedResponsibleParties(), specification.getCitedResponsibleParties()); assertEquals(expSpecification.getAlternateTitles(), specification.getAlternateTitles()); assertEquals(expSpecification, specification); assertEquals(expConformity, conformity); assertEquals(expCapabilities.getResourceType(), capabilities.getResourceType()); assertEquals(expTemporal.getDescription(), temporal.getDescription()); assertEquals(expExtentPeriod.getBeginning().getDate(), extentPeriod.getBeginning().getDate()); assertEquals(expExtentPeriod.getEnding().getDate(), extentPeriod.getEnding().getDate()); if (expExtentPeriod.getClass() == extentPeriod.getClass()) { /* * The time period created by this test case is an instance of org.geotoolkit.temporal.object.DefaultPeriod * while the unmarshalled period is an instance of org.geotoolkit.gml.xml.v311.TimePeriodType. This is okay * since DefaultPeriod does not have JAXB annotation. But it prevents us to compare the objects further. */ assertEquals(expExtentPeriod, extentPeriod); assertEquals(expTemporalExtent, temporalExtent); assertEquals(expTemporal, temporal); assertEquals(expCapabilities, capabilities); assertEquals(expResult, result); } }