package com.gisgraphy.domain.valueobject; import java.util.HashSet; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.gisgraphy.domain.geoloc.entity.Adm; import com.gisgraphy.domain.geoloc.entity.Country; import com.gisgraphy.domain.geoloc.entity.GisFeature; import com.gisgraphy.domain.geoloc.entity.Street; import com.gisgraphy.domain.geoloc.entity.ZipCode; import com.gisgraphy.helper.URLUtils; public class GisFeatureDistanceFactory { protected static final Logger logger = LoggerFactory .getLogger(GisFeatureDistance.class); public GisFeatureDistance fromGisFeature(GisFeature gisFeature, Double distance) { GisFeatureDistance gisFeatureDistance = new GisFeatureDistance(); gisFeatureDistance.setDistance(distance) ; if (gisFeature != null) { gisFeatureDistance.setId(gisFeature.getId()); gisFeatureDistance.setAdm1Code(gisFeature.getAdm1Code()); gisFeatureDistance.setAdm2Code(gisFeature.getAdm2Code()); gisFeatureDistance.setAdm3Code(gisFeature.getAdm3Code()); gisFeatureDistance.setAdm4Code(gisFeature.getAdm4Code()); gisFeatureDistance.setAdm1Name(gisFeature.getAdm1Name()); gisFeatureDistance.setAdm2Name(gisFeature.getAdm2Name()); gisFeatureDistance.setAdm3Name(gisFeature.getAdm3Name()); gisFeatureDistance.setAdm4Name(gisFeature.getAdm4Name()); gisFeatureDistance.setAdm5Name(gisFeature.getAdm5Name()); if (gisFeature.getAsciiName() != null) { gisFeatureDistance.setAsciiName(gisFeature.getAsciiName().trim()); } if (gisFeature.getCountryCode() != null) { gisFeatureDistance.setCountryCode(gisFeature.getCountryCode().toUpperCase()); } gisFeatureDistance.setElevation(gisFeature.getElevation()); gisFeatureDistance.setFeatureClass(gisFeature.getFeatureClass()); gisFeatureDistance.setFeatureCode(gisFeature.getFeatureCode()); gisFeatureDistance.setFeatureId(gisFeature.getFeatureId()); gisFeatureDistance.setGtopo30(gisFeature.getGtopo30()); gisFeatureDistance.setLocation(gisFeature.getLocation()); gisFeatureDistance.setName(gisFeature.getName().trim()); gisFeatureDistance.setPopulation(gisFeature.getPopulation()); gisFeatureDistance.setTimezone(gisFeature.getTimezone()); gisFeatureDistance.setOpenstreetmapId(gisFeature.getOpenstreetmapId()); gisFeatureDistance.setAmenity(gisFeature.getAmenity()); gisFeatureDistance.setLabel(gisFeature.getLabel()); gisFeatureDistance.setLabelPostal(gisFeature.getLabelPostal()); gisFeatureDistance.setFullyQualifiedName(gisFeature.getFullyQualifiedName()); gisFeatureDistance.setAlternateLabels(gisFeature.getAlternateLabels()); gisFeatureDistance.setZipCodes(new HashSet<String>());//TODO tests zip without zipcode Set<ZipCode> gisFeatureZipCodes = gisFeature.getZipCodes(); if (gisFeatureZipCodes != null){ for (ZipCode zipCode :gisFeatureZipCodes){ gisFeatureDistance.getZipCodes().add(zipCode.getCode()); } } gisFeatureDistance.setPlaceType(gisFeature.getClass().getSimpleName() .toLowerCase()); updateFields(gisFeatureDistance,null); } return gisFeatureDistance; } public GisFeatureDistance fromAdm(Adm adm, Double distance) { GisFeatureDistance gisFeatureDistance = fromGisFeature(adm, distance); gisFeatureDistance.setLevel(adm.getLevel()); return gisFeatureDistance; } public GisFeatureDistance fromStreet(Street street, Double distance) { GisFeatureDistance gisFeatureDistance = fromGisFeature(street,distance); gisFeatureDistance.setLength(street.getLength()); gisFeatureDistance.setOneWay(street.isOneWay()); gisFeatureDistance.setStreetType(street.getStreetType()); gisFeatureDistance.setIsIn(street.getIsIn()); gisFeatureDistance.setIsInAdm(street.getIsInAdm()); if (street.getIsInZip()!=null && street.getIsInZip().size()>=1){ //we took the first one gisFeatureDistance.setIsInZip(street.getIsInZip().iterator().next()); } gisFeatureDistance.setIsInPlace(street.getIsInPlace()); gisFeatureDistance.setLanes(street.getLanes()); gisFeatureDistance.setToll(street.isToll()); gisFeatureDistance.setSurface(street.getSurface()); gisFeatureDistance.setMaxSpeed(street.getMaxSpeed()); gisFeatureDistance.setMaxSpeedBackward(street.getMaxSpeedBackward()); gisFeatureDistance.setAzimuthStart(street.getAzimuthStart()); gisFeatureDistance.setAzimuthEnd(street.getAzimuthEnd()); gisFeatureDistance.setStreetRef(street.getStreetRef()); return gisFeatureDistance; } public GisFeatureDistance fromCountry(Country country, Double distance) { GisFeatureDistance gisFeatureDistance = fromGisFeature(country, distance); gisFeatureDistance.setElevation(country.getElevation()); gisFeatureDistance.setFeatureClass(country.getFeatureClass()); gisFeatureDistance.setFeatureCode(country.getFeatureCode()); gisFeatureDistance.setFeatureId(country.getFeatureId()); gisFeatureDistance.setGtopo30(country.getGtopo30()); gisFeatureDistance.setLocation(country.getLocation()); gisFeatureDistance.setName(country.getName().trim()); gisFeatureDistance.setPopulation(country.getPopulation()); gisFeatureDistance.setTimezone(country.getTimezone()); gisFeatureDistance.setArea(country.getArea()); gisFeatureDistance.setTld(country.getTld()); gisFeatureDistance.setCapitalName(country.getCapitalName()); gisFeatureDistance.setContinent(country.getContinent()); gisFeatureDistance.setPostalCodeMask(country.getPostalCodeMask()); gisFeatureDistance.setPostalCodeRegex(country.getPostalCodeRegex()); gisFeatureDistance.setCurrencyCode(country.getCurrencyCode()); gisFeatureDistance.setCurrencyName(country.getCurrencyName()); gisFeatureDistance.setEquivalentFipsCode(country.getEquivalentFipsCode()); gisFeatureDistance.setFipsCode(country.getFipsCode()); gisFeatureDistance.setIso3166Alpha2Code(country.getIso3166Alpha2Code()); gisFeatureDistance.setIso3166Alpha3Code(country.getIso3166Alpha3Code()); gisFeatureDistance.setIso3166NumericCode(country.getIso3166NumericCode()); gisFeatureDistance.setPhonePrefix(country.getPhonePrefix()); return gisFeatureDistance; } /** * update the calculated fields (GoogleMapUrl,YahooMapURL,CountryFlag,...) * */ public void updateFields(GisFeatureDistance gisFeatureDistance,Class clazz) { gisFeatureDistance.setOpenstreetmap_map_url(URLUtils.createOpenstreetmapMapUrl(gisFeatureDistance.getLocation())); gisFeatureDistance.setGoogle_map_url(URLUtils.createGoogleMapUrl(gisFeatureDistance.getLocation())); gisFeatureDistance.setYahoo_map_url(URLUtils.createYahooMapUrl(gisFeatureDistance.getLocation())); gisFeatureDistance.setCountry_flag_url(URLUtils.createCountryFlagUrl(gisFeatureDistance.getCountryCode())); if (gisFeatureDistance.getLocation() != null) { gisFeatureDistance.setLat(gisFeatureDistance.getLocation().getY()); gisFeatureDistance.setLng(gisFeatureDistance.getLocation().getX()); } if (gisFeatureDistance.getFeatureClass() != null && gisFeatureDistance.getFeatureCode() != null) { try { gisFeatureDistance.setPlaceType(FeatureCode.valueOf( gisFeatureDistance.getFeatureClass() + "_" + gisFeatureDistance.getFeatureCode()).getObject() .getClass().getSimpleName().toLowerCase()); } catch (RuntimeException e) { logger.warn("no feature code for "+gisFeatureDistance.getFeatureClass() + "_" + gisFeatureDistance.getFeatureCode()); } } else if (clazz!=null){ gisFeatureDistance.setPlaceType(clazz.getSimpleName().toLowerCase()); } } }