/*******************************************************************************
* Copyright (c) 2014 Open Door Logistics (www.opendoorlogistics.com)
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at http://www.gnu.org/licenses/lgpl.txt
******************************************************************************/
package com.opendoorlogistics.components.geocode.postcodes.impl;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
import com.opendoorlogistics.api.components.PredefinedTags;
import com.opendoorlogistics.core.utils.strings.Strings;
final public class PCRecord implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
public enum StrField{
COUNTRY_CODE("CountryCode"),
POSTAL_CODE("Postcode"),
PLACE_NAME("PlaceName"),
ADMIN_NAME1("AdminName1"),
ADMIN_CODE1("AdminCode1"),
ADMIN_NAME2("AdminName2"),
ADMIN_CODE2("AdminCode2"),
ADMIN_NAME3("AdminName3"),
ADMIN_CODE3("AdminCode3");
private final String displayText;
private final String [] tags;
private StrField(String displayText, String...tags) {
this.displayText = displayText;
this.tags = tags;
}
public String getDisplayText() {
return displayText;
}
public String[] getTags() {
return tags;
}
}
private String [] strs = new String[StrField.values().length];
private BigDecimal latitude;
private BigDecimal longitude;
private short accuracy;
public String getField(StrField fld){
return strs[fld.ordinal()];
}
public void setField(StrField fld, String val){
strs[fld.ordinal()]=val;
}
public BigDecimal getLatitude() {
return latitude;
}
public void setLatitude(BigDecimal latitude) {
this.latitude = latitude;
}
public BigDecimal getLongitude() {
return longitude;
}
public void setLongitude(BigDecimal longitude) {
this.longitude = longitude;
}
public short getAccuracy() {
return accuracy;
}
public void setAccuracy(short accuracy) {
this.accuracy = accuracy;
}
@Override
public String toString(){
StringBuilder builder = new StringBuilder();
for(StrField fld: StrField.values()){
builder.append(fld.name() +"=" + strs[fld.ordinal()]);
builder.append(", ");
}
return builder.toString()+ "lat=" + latitude + ", long=" + longitude + ", accuracy=" + accuracy;
}
public static PCRecord merge(List<PCRecord> records){
int n = records.size();
if(n==0){
return null;
}
else if(n==1){
return records.get(0);
}
BigDecimal lat=null;
BigDecimal lng=null;
// create record flagging accuracy as unknown
PCRecord ret = new PCRecord();
ret.setAccuracy((short)-1);
for(int i =0 ; i < n ; i++){
PCRecord rec = records.get(i);
if(i==0){
// copy initially
for(StrField fld : StrField.values()){
ret.setField(fld, rec.getField(fld));
}
lat = rec.getLatitude();
lng = rec.getLongitude();
}
else{
// sum lat and longs
lat = lat.add(rec.getLatitude());
lng = lng.add(rec.getLongitude());
// only keep identical fields
for(StrField fld : StrField.values()){
if(ret.getField(fld).equals(rec.getField(fld))==false){
ret.setField(fld, "");
}
}
}
}
lat = lat.divide(new BigDecimal(n), BigDecimal.ROUND_HALF_UP);
lng = lng.divide(new BigDecimal(n), BigDecimal.ROUND_HALF_UP);
ret.setLatitude(lat);
ret.setLongitude(lng);
return ret;
}
}