package me.osm.gazetter.out; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.Map; import java.util.Set; import me.osm.gazetter.addresses.AddressesSchemesParser; import me.osm.gazetter.striper.FeatureTypes; import me.osm.gazetter.striper.GeoJsonWriter; import org.json.JSONObject; public class AddrRowValueExctractorImpl implements AddrRowValueExtractor { private static final String BOUNDARY_2_ID = "boundary:2.id"; private static final String BOUNDARY_2 = "boundary:2"; private static final String BOUNDARY_3_ID = "boundary:3.id"; private static final String BOUNDARY_3 = "boundary:3"; private static final String BOUNDARY_4_ID = "boundary:4.id"; private static final String BOUNDARY_4 = "boundary:4"; private static final String BOUNDARY_5_ID = "boundary:5.id"; private static final String BOUNDARY_5 = "boundary:5"; private static final String BOUNDARY_6_ID = "boundary:6.id"; private static final String BOUNDARY_6 = "boundary:6"; private static final String BOUNDARY_8_ID = "boundary:8.id"; private static final String BOUNDARY_8 = "boundary:8"; private static final String PLACE_CITY_ID = "place:city.id"; private static final String PLACE_CITY = "place:city"; private static final String PLACE_TOWN_ID = "place:town.id"; private static final String PLACE_TOWN = "place:town"; private static final String PLACE_HAMLET_ID = "place:hamlet.id"; private static final String PLACE_HAMLET = "place:hamlet"; private static final String PLACE_VILLAGE_ID = "place:village.id"; private static final String PLACE_VILLAGE = "place:village"; private static final String PLACE_ISOLATED_DWELLING_ID = "place:isolated_dwelling.id"; private static final String PLACE_ISOLATED_DWELLING = "place:isolated_dwelling"; private static final String PLACE_LOCALITY_ID = "place:locality.id"; private static final String PLACE_LOCALITY = "place:locality"; private static final String PLACE_ALLOTMENTS_ID = "place:allotments.id"; private static final String PLACE_ALLOTMENTS = "place:allotments"; private static final String PLACE_SUBURB_ID = "place:suburb.id"; private static final String PLACE_SUBURB = "place:suburb"; private static final String PLACE_NEIGHBOURHOOD_ID = "place:neighbourhood.id"; private static final String PLACE_NEIGHBOURHOOD = "place:neighbourhood"; private static final String PLACE_QUARTER_ID = "place:quarter.id"; private static final String PLACE_QUARTER = "place:quarter"; private static final String STREET_ID = "street.id"; private static final String STREET_UID = "street.uid"; private static final String STREET = "street"; private static final String HOUSENUMBER = "hn"; private static final String LETTER = "letter"; private static final String POSTCODE = "postcode"; private static final String ADDR_TEXT = "addr-text"; private static final String ADDR_LONG_TEXT = "addr-long-text"; private static final String UID = "uid"; private Set<String> supported = new HashSet<String>(getSupportedKeys()); @Override public String getValue(String key, JSONObject jsonObject, Map<String, JSONObject> levels, JSONObject addrRow) { if(levels == null) { return null; } try { if(UID.equals(key)) { String ftype = jsonObject.getString("ftype"); return getUID(jsonObject, addrRow, ftype); } if(ADDR_TEXT.equals(key)) { return addrRow.optString("text"); } if(ADDR_LONG_TEXT.equals(key)) { return addrRow.optString("longText"); } if(key.endsWith(".uid")) { String keyUID = key.replace(".uid", ""); if("street".equals(keyUID)) { int strtUID = levels.get(keyUID).getInt("strtUID"); if(strtUID == 0) { return levels.get(keyUID).getString("lnk"); } String h = getPositiveHash(strtUID); return levels.get(keyUID).getString("lnk") + "-" + h; } return levels.get(keyUID).getString("lnk"); } if(key.endsWith(".id")) { return levels.get(key.replace(".id", "")).getString("lnk"); } if(key.endsWith(".lvl-size")) { return levels.get(key.replace(".lvl-size", "")).getString("lvl-size"); } if(LETTER.equals(key)) { return jsonObject.getJSONObject(GeoJsonWriter.PROPERTIES).optString("addr:letter"); } JSONObject lvl = levels.get(key); if(lvl != null && lvl.has("name")) { return lvl.getString("name"); } return null; } catch (Exception e) { return null; } } public static String getUID(JSONObject jsonObject, JSONObject addrRow, String ftype) { if(FeatureTypes.HIGHWAY_FEATURE_TYPE.equals(ftype)) { int hash = addrRow.getInt("boundariesHash"); if(hash == 0) { return jsonObject.getString("id"); } String h = getPositiveHash(hash); return jsonObject.getString("id") + "--" + h; } if(FeatureTypes.ADDR_POINT_FTYPE.equals(ftype)) { String addrType = addrRow.optString(AddressesSchemesParser.ADDR_SCHEME); return jsonObject.getString("id") + "--" + addrType; } if(FeatureTypes.POI_FTYPE.equals(ftype)) { String addrType = addrRow.optString(AddressesSchemesParser.ADDR_SCHEME); return jsonObject.getString("id") + "--" + addrType; } return jsonObject.getString("id"); } private static String getPositiveHash(int hash) { if(hash > 0) { return String.valueOf(hash); } return "m" + String.valueOf(Math.abs(hash)); } @Override public Collection<String> getSupportedKeys() { return Arrays.asList(POSTCODE, LETTER, HOUSENUMBER, STREET, STREET_ID, PLACE_QUARTER, PLACE_QUARTER_ID, PLACE_NEIGHBOURHOOD, PLACE_NEIGHBOURHOOD_ID, PLACE_SUBURB, PLACE_SUBURB_ID, PLACE_ALLOTMENTS, PLACE_ALLOTMENTS_ID, PLACE_LOCALITY, PLACE_LOCALITY_ID, PLACE_ISOLATED_DWELLING, PLACE_ISOLATED_DWELLING_ID, PLACE_VILLAGE, PLACE_VILLAGE_ID, PLACE_HAMLET, PLACE_HAMLET_ID, PLACE_CITY, PLACE_CITY_ID, PLACE_TOWN, PLACE_TOWN_ID, BOUNDARY_8, BOUNDARY_8_ID, BOUNDARY_6, BOUNDARY_6_ID, BOUNDARY_5, BOUNDARY_5_ID, BOUNDARY_4, BOUNDARY_4_ID, BOUNDARY_3, BOUNDARY_3_ID, BOUNDARY_2, BOUNDARY_2_ID, ADDR_TEXT, ADDR_LONG_TEXT, UID, STREET_UID); } @Override public boolean supports(String key) { return supported.contains(key); } }