X-Git-Url: https://git.mdrn.pl/pylucene.git/blobdiff_plain/a2e61f0c04805cfcb8706176758d1283c7e3a55c..aaeed5504b982cf3545252ab528713250aa33eed:/lucene-java-3.5.0/lucene/contrib/spatial/src/java/org/apache/lucene/spatial/geometry/FixedLatLng.java diff --git a/lucene-java-3.5.0/lucene/contrib/spatial/src/java/org/apache/lucene/spatial/geometry/FixedLatLng.java b/lucene-java-3.5.0/lucene/contrib/spatial/src/java/org/apache/lucene/spatial/geometry/FixedLatLng.java new file mode 100644 index 0000000..88e3150 --- /dev/null +++ b/lucene-java-3.5.0/lucene/contrib/spatial/src/java/org/apache/lucene/spatial/geometry/FixedLatLng.java @@ -0,0 +1,160 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * 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. + */ + +package org.apache.lucene.spatial.geometry; + +/** + *

NOTE: This API is still in + * flux and might change in incompatible ways in the next + * release. + */ +public class FixedLatLng extends LatLng { + public static final double SCALE_FACTOR=1000000; + public static final int SCALE_FACTOR_INT=1000000; + + private int lat, lng; + private boolean normalized; + + public FixedLatLng(int lat, int lng) { + setLat(lat); + setLng(lng); + } + + public FixedLatLng(LatLng ll) { + this.lat=ll.getFixedLat(); + this.lng=ll.getFixedLng(); + } + + protected void setLat(int lat) { + if (lat>90*SCALE_FACTOR || lat<-90*SCALE_FACTOR) { + throw new IllegalArgumentException("Illegal lattitude"); + } + this.lat=lat; + } + + protected void setLng(int lng) { + this.lng=lng; + } + + public static double fixedToDouble(int fixed) { + return (fixed)/SCALE_FACTOR; + } + + public static int doubleToFixed(double d) { + return (int)(d*SCALE_FACTOR); + } + + @Override + public LatLng copy() { + return new FixedLatLng(this); + } + + @Override + public int getFixedLat() { + return lat; + } + + @Override + public int getFixedLng() { + return lng; + } + + @Override + public double getLat() { + return fixedToDouble(lat); + } + + @Override + public double getLng() { + return fixedToDouble(lng); + } + + @Override + public boolean isFixedPoint() { + return true; + } + + @Override + public FixedLatLng toFixed() { + return this; + } + + @Override + public FloatLatLng toFloat() { + return new FloatLatLng(this); + } + + @Override + public boolean isNormalized() { + return + normalized || ( + (lng>=-180*SCALE_FACTOR_INT) && + (lng<=180*SCALE_FACTOR_INT) + ); + } + + @Override + public LatLng normalize() { + if (isNormalized()) return this; + + int delta=0; + if (lng<0) delta=360*SCALE_FACTOR_INT; + if (lng>=0) delta=-360*SCALE_FACTOR_INT; + + int newLng=lng; + while (newLng<=-180*SCALE_FACTOR_INT || newLng>=180*SCALE_FACTOR_INT) { + newLng+=delta; + } + + FixedLatLng ret=new FixedLatLng(lat, newLng); + ret.normalized=true; + return ret; + } + + @Override + public LatLng calculateMidpoint(LatLng other) { + return new FixedLatLng( + (lat+other.getFixedLat())/2, + (lng+other.getFixedLng())/2); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = prime + lat; + result = prime * result + lng; + result = prime * result + (normalized ? 1231 : 1237); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (getClass() != obj.getClass()) + return false; + FixedLatLng other = (FixedLatLng) obj; + if (lat != other.lat) + return false; + if (lng != other.lng) + return false; + if (normalized != other.normalized) + return false; + return true; + } + +}