/** * 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; /** * <p><font color="red"><b>NOTE:</b> This API is still in * flux and might change in incompatible ways in the next * release.</font> */ 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; } }