use of org.opengis.metadata.extent.Extent in project sis by apache.
the class EPSGDataAccess method createExtent.
/**
* Creates information about spatial, vertical, and temporal extent (usually a domain of validity) from a code.
*
* <div class="note"><b>Example:</b>
* some EPSG codes for extents are:
*
* <table class="sis" summary="EPSG codes examples">
* <tr><th>Code</th> <th>Description</th></tr>
* <tr><td>1262</td> <td>World</td></tr>
* <tr><td>3391</td> <td>World - between 80°S and 84°N</td></tr>
* </table></div>
*
* @param code value allocated by EPSG.
* @return the extent for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see #createCoordinateReferenceSystem(String)
* @see #createDatum(String)
* @see org.apache.sis.metadata.iso.extent.DefaultExtent
*/
@Override
public synchronized Extent createExtent(final String code) throws NoSuchAuthorityCodeException, FactoryException {
ArgumentChecks.ensureNonNull("code", code);
Extent returnValue = null;
try (ResultSet result = executeQuery("Area", "AREA_CODE", "AREA_NAME", "SELECT AREA_OF_USE," + " AREA_SOUTH_BOUND_LAT," + " AREA_NORTH_BOUND_LAT," + " AREA_WEST_BOUND_LON," + " AREA_EAST_BOUND_LON" + " FROM [Area]" + " WHERE AREA_CODE = ?", code)) {
while (result.next()) {
final String description = getOptionalString(result, 1);
double ymin = getOptionalDouble(result, 2);
double ymax = getOptionalDouble(result, 3);
double xmin = getOptionalDouble(result, 4);
double xmax = getOptionalDouble(result, 5);
DefaultGeographicBoundingBox bbox = null;
if (!Double.isNaN(ymin) || !Double.isNaN(ymax) || !Double.isNaN(xmin) || !Double.isNaN(xmax)) {
/*
* Fix an error found in EPSG:3790 New Zealand - South Island - Mount Pleasant mc
* for older database (this error is fixed in EPSG database 8.2).
*
* Do NOT apply anything similar for the x axis, because xmin > xmax is not error:
* it describes a bounding box spanning the anti-meridian (±180° of longitude).
*/
if (ymin > ymax) {
final double t = ymin;
ymin = ymax;
ymax = t;
}
bbox = new DefaultGeographicBoundingBox(xmin, xmax, ymin, ymax);
}
if (description != null || bbox != null) {
DefaultExtent extent = new DefaultExtent(description, bbox, null, null);
extent.freeze();
returnValue = ensureSingleton(extent, returnValue, code);
}
}
} catch (SQLException exception) {
throw databaseFailure(Extent.class, code, exception);
}
if (returnValue == null) {
throw noSuchAuthorityCode(Extent.class, code);
}
return returnValue;
}
use of org.opengis.metadata.extent.Extent in project sis by apache.
the class ReferencingFunctions method getDomainOfValidity.
/**
* Returns the domain of validity from an authority code.
*
* @param codeOrPath the code allocated by an authority, or the path to a file.
* @return the domain of validity.
*/
@Override
public String getDomainOfValidity(final String codeOrPath) {
final Object domain;
try {
final IdentifiedObject object = getIdentifiedObject(codeOrPath, null);
domain = IdentifiedObjects.getProperties(object).get(ReferenceSystem.DOMAIN_OF_VALIDITY_KEY);
} catch (Exception exception) {
return getLocalizedMessage(exception);
}
if (domain instanceof Extent) {
final InternationalString description = ((Extent) domain).getDescription();
if (description != null) {
return description.toString(getJavaLocale());
}
}
return noResultString();
}
use of org.opengis.metadata.extent.Extent in project tika by apache.
the class GeographicInformationParser method getMetaDataIdentificationInfo.
private void getMetaDataIdentificationInfo(Metadata metadata, DefaultMetadata defaultMetaData) {
ArrayList<Identification> identifications = (ArrayList<Identification>) defaultMetaData.getIdentificationInfo();
for (Identification i : identifications) {
DefaultDataIdentification defaultDataIdentification = (DefaultDataIdentification) i;
if (i.getCitation() != null && i.getCitation().getTitle() != null)
metadata.add("IdentificationInfoCitationTitle ", i.getCitation().getTitle().toString());
ArrayList<CitationDate> dateArrayList = (ArrayList<CitationDate>) i.getCitation().getDates();
for (CitationDate d : dateArrayList) {
if (d.getDateType() != null)
metadata.add("CitationDate ", d.getDateType().name() + "-->" + d.getDate());
}
ArrayList<ResponsibleParty> responsiblePartyArrayList = (ArrayList<ResponsibleParty>) i.getCitation().getCitedResponsibleParties();
for (ResponsibleParty r : responsiblePartyArrayList) {
if (r.getRole() != null)
metadata.add("CitedResponsiblePartyRole ", r.getRole().toString());
if (r.getIndividualName() != null)
metadata.add("CitedResponsiblePartyName ", r.getIndividualName().toString());
if (r.getOrganisationName() != null)
metadata.add("CitedResponsiblePartyOrganizationName ", r.getOrganisationName().toString());
if (r.getPositionName() != null)
metadata.add("CitedResponsiblePartyPositionName ", r.getPositionName().toString());
if (r.getContactInfo() != null) {
for (String s : r.getContactInfo().getAddress().getElectronicMailAddresses()) {
metadata.add("CitedResponsiblePartyEMail ", s.toString());
}
}
}
if (i.getAbstract() != null)
metadata.add("IdentificationInfoAbstract ", i.getAbstract().toString());
for (Progress p : i.getStatus()) {
metadata.add("IdentificationInfoStatus ", p.name());
}
ArrayList<Format> formatArrayList = (ArrayList<Format>) i.getResourceFormats();
for (Format f : formatArrayList) {
if (f.getName() != null)
metadata.add("ResourceFormatSpecificationAlternativeTitle ", f.getName().toString());
}
CheckedHashSet<Locale> localeCheckedHashSet = (CheckedHashSet<Locale>) defaultDataIdentification.getLanguages();
for (Locale l : localeCheckedHashSet) {
metadata.add("IdentificationInfoLanguage-->", l.getDisplayLanguage(Locale.ENGLISH));
}
CodeListSet<TopicCategory> categoryList = (CodeListSet<TopicCategory>) defaultDataIdentification.getTopicCategories();
for (TopicCategory t : categoryList) {
metadata.add("IdentificationInfoTopicCategory-->", t.name());
}
ArrayList<Keywords> keywordList = (ArrayList<Keywords>) i.getDescriptiveKeywords();
int j = 1;
for (Keywords k : keywordList) {
j++;
ArrayList<InternationalString> stringList = (ArrayList<InternationalString>) k.getKeywords();
for (InternationalString s : stringList) {
metadata.add("Keywords " + j, s.toString());
}
if (k.getType() != null)
metadata.add("KeywordsType " + j, k.getType().name());
if (k.getThesaurusName() != null && k.getThesaurusName().getTitle() != null)
metadata.add("ThesaurusNameTitle " + j, k.getThesaurusName().getTitle().toString());
if (k.getThesaurusName() != null && k.getThesaurusName().getAlternateTitles() != null)
metadata.add("ThesaurusNameAlternativeTitle " + j, k.getThesaurusName().getAlternateTitles().toString());
ArrayList<CitationDate> citationDates = (ArrayList<CitationDate>) k.getThesaurusName().getDates();
for (CitationDate cd : citationDates) {
if (cd.getDateType() != null)
metadata.add("ThesaurusNameDate ", cd.getDateType().name() + "-->" + cd.getDate());
}
}
ArrayList<DefaultLegalConstraints> constraintList = (ArrayList<DefaultLegalConstraints>) i.getResourceConstraints();
for (DefaultLegalConstraints c : constraintList) {
for (Restriction r : c.getAccessConstraints()) {
metadata.add("AccessContraints ", r.name());
}
for (InternationalString s : c.getOtherConstraints()) {
metadata.add("OtherConstraints ", s.toString());
}
for (Restriction r : c.getUseConstraints()) {
metadata.add("UserConstraints ", r.name());
}
}
Collection<Extent> extentList = ((DefaultDataIdentification) i).getExtents();
for (Extent e : extentList) {
ArrayList<GeographicExtent> geoElements = (ArrayList<GeographicExtent>) e.getGeographicElements();
for (GeographicExtent g : geoElements) {
if (g instanceof DefaultGeographicDescription) {
if (((DefaultGeographicDescription) g).getGeographicIdentifier() != null && ((DefaultGeographicDescription) g).getGeographicIdentifier().getCode() != null)
metadata.add("GeographicIdentifierCode ", ((DefaultGeographicDescription) g).getGeographicIdentifier().getCode().toString());
if (((DefaultGeographicDescription) g).getGeographicIdentifier() != null && ((DefaultGeographicDescription) g).getGeographicIdentifier().getAuthority() != null && ((DefaultGeographicDescription) g).getGeographicIdentifier().getAuthority().getTitle() != null)
metadata.add("GeographicIdentifierAuthorityTitle ", ((DefaultGeographicDescription) g).getGeographicIdentifier().getAuthority().getTitle().toString());
for (InternationalString s : ((DefaultGeographicDescription) g).getGeographicIdentifier().getAuthority().getAlternateTitles()) {
metadata.add("GeographicIdentifierAuthorityAlternativeTitle ", s.toString());
}
for (CitationDate cd : ((DefaultGeographicDescription) g).getGeographicIdentifier().getAuthority().getDates()) {
if (cd.getDateType() != null && cd.getDate() != null)
metadata.add("GeographicIdentifierAuthorityDate ", cd.getDateType().name() + " " + cd.getDate().toString());
}
}
}
}
}
}
use of org.opengis.metadata.extent.Extent in project sis by apache.
the class LocationFormat method format.
/**
* Writes a textual representation of the given location in the given stream or buffer.
*
* <div class="warning"><b>Upcoming API change — generalization</b><br>
* in a future SIS version, the type of {@code location} parameter may be generalized
* to the {@code org.opengis.referencing.gazetteer.Location} interface.
* This change is pending GeoAPI revision.</div>
*
* @param location the location to format.
* @param toAppendTo where to format the location.
* @throws IOException if an error occurred while writing to the given appendable.
*/
@Override
@SuppressWarnings({ "fallthrough", "null" })
public void format(final AbstractLocation location, final Appendable toAppendTo) throws IOException {
ArgumentChecks.ensureNonNull("location", location);
final Locale locale = getLocale(Locale.Category.DISPLAY);
final Vocabulary vocabulary = Vocabulary.getResources(locale);
final TableAppender table = new TableAppender(toAppendTo, "│ ", columnSeparator, " │");
table.setMultiLinesCells(true);
/*
* Location type.
*/
table.appendHorizontalSeparator();
final AbstractLocationType type = location.type();
if (type != null) {
append(table, vocabulary, Vocabulary.Keys.LocationType, toString(type.getName(), locale));
}
/*
* Geographic identifier and alternative identifiers, if any.
*/
append(table, vocabulary, Vocabulary.Keys.GeographicIdentifier, toString(location.getGeographicIdentifier(), locale));
final Collection<? extends InternationalString> alt = location.getAlternativeGeographicIdentifiers();
if (alt != null && !alt.isEmpty()) {
boolean isFirst = true;
vocabulary.appendLabel(Vocabulary.Keys.AlternativeIdentifiers, table);
nextColumn(table);
for (final InternationalString id : alt) {
if (!isFirst) {
isFirst = false;
table.append(lineSeparator);
}
table.append(id);
}
table.nextLine();
}
/*
* Extents (temporal and geographic). If an envelope exists and the CRS is not geographic,
* then the envelope bounds will be appended on the same lines than the geographic bounds.
* But before writing the bounding box and/or the envelope, check if they are redundant.
* We may also need to change axis order (but not unit) of the envelope in order to match
* the axis order of the geographic bounding box.
*/
final Extent extent = new DefaultExtent(null, location.getGeographicExtent(), null, location.getTemporalExtent());
final Range<Date> time = Extents.getTimeRange(extent);
if (time != null) {
append(table, vocabulary, Vocabulary.Keys.StartDate, toString(time.getMinValue()));
append(table, vocabulary, Vocabulary.Keys.EndDate, toString(time.getMaxValue()));
}
GeographicBoundingBox bbox = Extents.getGeographicBoundingBox(extent);
Envelope envelope = location.getEnvelope();
DirectPosition position = position(location.getPosition());
// Position in geographic CRS.
DirectPosition geopos = null;
// Envelope Coordinate Reference System.
CoordinateReferenceSystem crs = null;
// CRS in conventional (x,y) axis order.
CoordinateReferenceSystem normCRS = null;
// If failed to transform envelope.
Exception warning = null;
try {
if (envelope != null) {
normCRS = normalize(crs = envelope.getCoordinateReferenceSystem());
if (normCRS != crs) {
// Should only change order and sign.
envelope = Envelopes.transform(envelope, normCRS);
}
}
if (position != null) {
/*
* If only one of the envelope or the position objects specify a CRS, assume that the other object
* use the same CRS. If both the envelope and the position objects specify a CRS, the envelope CRS
* will have precedence and the "representative position" will be projected to that CRS.
*/
final CoordinateReferenceSystem posCRS = position.getCoordinateReferenceSystem();
if (normCRS == null) {
normCRS = normalize(crs = posCRS);
if (normCRS != crs) {
// Should only change order and sign.
envelope = Envelopes.transform(envelope, normCRS);
}
}
if (bbox != null) {
// Compute geographic position only if there is a geographic bounding box.
GeographicCRS geogCRS = ReferencingUtilities.toNormalizedGeographicCRS(posCRS);
if (geogCRS != null) {
geopos = transform(position, posCRS, geogCRS);
}
}
position = transform(position, posCRS, normCRS);
}
} catch (FactoryException | TransformException e) {
envelope = null;
position = null;
warning = e;
}
/*
* At this point we got the final geographic bounding box and/or envelope to write.
* Since we will write the projected and geographic coordinates side-by-side in the same cells,
* we need to format them in advance so we can compute their width for internal right-alignment.
* We do the alignment ourselves instead than using TableAppender.setCellAlignment(ALIGN_RIGHT)
* because we do not want (projected geographic) tuple to appear far on the right side if other
* cells have long texts.
*/
if (bbox != null || envelope != null) {
final CoordinateSystem cs = (crs != null) ? crs.getCoordinateSystem() : null;
String[] geographic = null;
String[] projected = null;
String[] unitSymbol = null;
AngleFormat geogFormat = null;
NumberFormat projFormat = null;
UnitFormat unitFormat = null;
int maxGeogLength = 0;
int maxProjLength = 0;
int maxUnitLength = 0;
boolean showProj = false;
if (bbox != null || geopos != null) {
geogFormat = (AngleFormat) getFormat(Angle.class);
geographic = new String[BOUND_KEY.length];
Arrays.fill(geographic, "");
}
if (envelope != null || position != null) {
projFormat = (NumberFormat) getFormat(Number.class);
unitFormat = (UnitFormat) getFormat(Unit.class);
projected = new String[BOUND_KEY.length];
unitSymbol = new String[BOUND_KEY.length];
Arrays.fill(projected, "");
Arrays.fill(unitSymbol, "");
}
for (int i = 0; i < BOUND_KEY.length; i++) {
RoundingMode rounding = RoundingMode.FLOOR;
double g = Double.NaN;
double p = Double.NaN;
int dimension = 0;
switch(i) {
case 0:
if (bbox != null)
g = bbox.getWestBoundLongitude();
if (envelope != null)
p = envelope.getMinimum(0);
break;
case 2:
if (bbox != null)
g = bbox.getEastBoundLongitude();
if (envelope != null)
p = envelope.getMaximum(0);
rounding = RoundingMode.CEILING;
break;
case 3:
if (bbox != null)
g = bbox.getSouthBoundLatitude();
if (envelope != null)
p = envelope.getMinimum(1);
dimension = 1;
break;
case 5:
if (bbox != null)
g = bbox.getNorthBoundLatitude();
if (envelope != null)
p = envelope.getMaximum(1);
rounding = RoundingMode.CEILING;
dimension = 1;
break;
// Fall through
case 4:
dimension = 1;
case 1:
if (geopos != null)
g = geopos.getOrdinate(dimension);
if (position != null)
p = position.getOrdinate(dimension);
rounding = RoundingMode.HALF_EVEN;
break;
}
if (!Double.isNaN(p)) {
showProj |= (g != p);
if (cs != null) {
final Unit<?> unit = cs.getAxis(dimension).getUnit();
if (unit != null) {
final int length = (unitSymbol[i] = unitFormat.format(unit)).length();
if (length > maxUnitLength) {
maxUnitLength = length;
}
}
}
try {
projFormat.setRoundingMode(rounding);
} catch (UnsupportedOperationException e) {
// Ignore.
}
final int length = (projected[i] = projFormat.format(p)).length();
if (length > maxProjLength) {
maxProjLength = length;
}
}
if (!Double.isNaN(g)) {
geogFormat.setRoundingMode(rounding);
final Angle angle = (dimension == 0) ? new Longitude(g) : new Latitude(g);
final int length = (geographic[i] = geogFormat.format(angle)).length();
if (length > maxGeogLength) {
maxGeogLength = length;
}
}
}
if (!showProj) {
// All projected coordinates are identical to geographic ones.
projected = null;
unitSymbol = null;
maxProjLength = 0;
maxUnitLength = 0;
} else if (maxProjLength != 0) {
if (maxUnitLength != 0) {
maxUnitLength++;
}
// Arbitrary space between projected and geographic coordinates.
maxGeogLength += 4;
}
/*
* At this point all coordinates have been formatted in advance.
*/
final String separator = (projected != null && geographic != null) ? " —" : "";
for (int i = 0; i < BOUND_KEY.length; i++) {
final String p = (projected != null) ? projected[i] : "";
final String u = (unitSymbol != null) ? unitSymbol[i] : "";
final String g = (geographic != null) ? geographic[i] : "";
if (!p.isEmpty() || !g.isEmpty()) {
vocabulary.appendLabel(BOUND_KEY[i], table);
nextColumn(table);
table.append(CharSequences.spaces(maxProjLength - p.length())).append(p);
table.append(CharSequences.spaces(maxUnitLength - u.length())).append(u).append(separator);
table.append(CharSequences.spaces(maxGeogLength - g.length())).append(g);
table.nextLine();
}
}
}
if (crs != null) {
append(table, vocabulary, Vocabulary.Keys.CoordinateRefSys, IdentifiedObjects.getName(crs, null));
}
/*
* Organization responsible for defining the characteristics of the location instance.
*/
final AbstractParty administrator = location.getAdministrator();
if (administrator != null) {
append(table, vocabulary, Vocabulary.Keys.Administrator, toString(administrator.getName(), locale));
}
table.appendHorizontalSeparator();
table.flush();
if (warning != null) {
vocabulary.appendLabel(Vocabulary.Keys.Warnings, toAppendTo);
toAppendTo.append(warning.toString()).append(lineSeparator);
}
}
use of org.opengis.metadata.extent.Extent in project sis by apache.
the class Formatter method appendForSubtypes.
/**
* Appends the anchor, scope and domain of validity of the given object. Those information are available
* only for {@link ReferenceSystem}, {@link Datum} and {@link CoordinateOperation} objects.
*/
private void appendForSubtypes(final IdentifiedObject object) {
final InternationalString anchor, scope;
final Extent area;
if (object instanceof ReferenceSystem) {
anchor = null;
scope = ((ReferenceSystem) object).getScope();
area = ((ReferenceSystem) object).getDomainOfValidity();
} else if (object instanceof Datum) {
anchor = ((Datum) object).getAnchorPoint();
scope = ((Datum) object).getScope();
area = ((Datum) object).getDomainOfValidity();
} else if (object instanceof CoordinateOperation) {
anchor = null;
scope = ((CoordinateOperation) object).getScope();
area = ((CoordinateOperation) object).getDomainOfValidity();
} else {
return;
}
appendOnNewLine(WKTKeywords.Anchor, anchor, null);
appendOnNewLine(WKTKeywords.Scope, scope, ElementKind.SCOPE);
if (area != null) {
appendOnNewLine(WKTKeywords.Area, area.getDescription(), ElementKind.EXTENT);
append(Extents.getGeographicBoundingBox(area), BBOX_ACCURACY);
appendVerticalExtent(Extents.getVerticalRange(area));
appendTemporalExtent(Extents.getTimeRange(area));
}
}
Aggregations