blob: 4cf08031099926ffe114b7040fe82d552d3a483f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. The ASF licenses this file to You
* under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License. For additional information regarding
* copyright in this work, please see the NOTICE file in the top level
* directory of this distribution.
*/
package org.apache.abdera2.common.geo;
import java.util.Iterator;
public abstract class Multiple extends Position implements Iterable<Coordinate> {
private static final long serialVersionUID = -401256381030284678L;
protected Coordinates coordinates;
public Multiple() {
}
public Multiple(Multiple... multiples) {
this.coordinates = new Coordinates();
for (Multiple m : multiples)
coordinates.add(m.getCoordinates());
}
public Multiple(Multiple multiple) {
this(multiple.getCoordinates().clone());
}
public Multiple(Point point) {
this(point.getCoordinate().clone());
}
public Multiple(Point... points) {
this.coordinates = new Coordinates();
for (Point p : points)
coordinates.add(p.getCoordinate());
}
public Multiple(Coordinates coordinates) {
this.coordinates = coordinates;
}
public Multiple(Coordinate... coordinates) {
this.coordinates = new Coordinates(coordinates);
}
public Multiple(String value) {
this.coordinates = new Coordinates(value);
}
public Multiple(double... values) {
this.coordinates = new Coordinates();
for (int n = 0; n < values.length; n = n + 2) {
Coordinate c = new Coordinate(values[n], values[n + 1]);
this.coordinates.add(c);
}
}
public Coordinates getCoordinates() {
return coordinates;
}
public void setCoordinates(Coordinates coordinates) {
this.coordinates = coordinates;
}
public Iterator<Coordinate> iterator() {
return coordinates.iterator();
}
@Override
public int hashCode() {
final int PRIME = 31;
int result = super.hashCode();
result = PRIME * result + ((coordinates == null) ? 0 : coordinates.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!super.equals(obj))
return false;
if (getClass() != obj.getClass())
return false;
final Multiple other = (Multiple)obj;
if (coordinates == null) {
if (other.coordinates != null)
return false;
} else if (!coordinates.equals(other.coordinates))
return false;
return true;
}
public int compareTo(Position o) {
if (o == null || !this.getClass().isInstance(o) || equals(o))
return 0;
return coordinates.compareTo(((Multiple)o).coordinates);
}
protected void verify179Rule() {
for (Coordinate c1 : getCoordinates()) {
for (Coordinate c2 : getCoordinates()) {
check179(c1.getLatitude(), c2.getLatitude());
check179(c1.getLongitude(), c2.getLongitude());
}
}
}
private void check179(double d1, double d2) {
if (Math.abs(Math.max(d1, d2)) - Math.abs(Math.min(d1, d2)) > 179)
throw new RuntimeException("Values are greater than 179 degrees");
}
}