X-Git-Url: https://git.argeo.org/?p=gpl%2Fargeo-suite.git;a=blobdiff_plain;f=knowledge%2Forg.argeo.support.geonames%2Fsrc%2Forg%2Fargeo%2Fsupport%2Fgeonames%2FGeonamesAdm.java;h=d57827219fd8f04b5d709a3e98a05245682c813a;hp=ff1de7500fdc4b405a179ba1984eb60ea0e65cf8;hb=f1bad89ca61df0dc06b1304f147cf1c35d54803f;hpb=56e0ce8ed36343091ebd9f31150ef5d02ef454c3 diff --git a/knowledge/org.argeo.support.geonames/src/org/argeo/support/geonames/GeonamesAdm.java b/knowledge/org.argeo.support.geonames/src/org/argeo/support/geonames/GeonamesAdm.java index ff1de75..d578272 100644 --- a/knowledge/org.argeo.support.geonames/src/org/argeo/support/geonames/GeonamesAdm.java +++ b/knowledge/org.argeo.support.geonames/src/org/argeo/support/geonames/GeonamesAdm.java @@ -2,37 +2,47 @@ package org.argeo.support.geonames; import java.time.LocalDate; import java.time.ZoneId; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Map; +import java.util.function.Function; /** A Geonames administrative subdivision. */ public class GeonamesAdm { - private Long geonameId; - private String countryCode; - private String admLevel; - private Integer level; - private String name; - private String asciiName; - private List alternateNames; - private Double lat; - private Double lng; - private LocalDate lastUpdated; - private ZoneId timeZone; + private final Long geonameId; + private final String countryCode; + private final String adminCode1; + private final String admLevel; + private final Integer level; + private final String name; + private final String asciiName; + private final List alternateNames; + private final Double lat; + private final Double lng; + private final LocalDate lastUpdated; + private final ZoneId timeZone; + + private final Long[] upperLevelIds = new Long[5]; + private final List upperLevels = new ArrayList<>(); private List row; - public GeonamesAdm() { - } - /** Initialise from a row in the main Geonames table. */ public GeonamesAdm(List row) { geonameId = Long.parseLong(row.get(0)); admLevel = row.get(7); countryCode = row.get(8); - if (admLevel.startsWith("ADM") && !admLevel.endsWith("H")) { - level = Integer.parseInt(admLevel.substring(3)); + adminCode1 = row.get(10); + if (admLevel.startsWith("ADM")) { + if (admLevel.endsWith("H")) + level = Integer.parseInt(admLevel.substring(3, admLevel.length() - 1)); + else + level = Integer.parseInt(admLevel.substring(3)); } else if (admLevel.equals("PCLI")) { level = 0; + } else { + throw new IllegalArgumentException("Unsupported admin level " + admLevel); } name = row.get(1); asciiName = row.get(2); @@ -41,9 +51,23 @@ public class GeonamesAdm { lng = Double.parseDouble(row.get(5)); lastUpdated = LocalDate.parse(row.get(18)); timeZone = ZoneId.of(row.get(17)); + // upper levels + if (row.get(11) != null && !row.get(11).trim().equals("")) + upperLevelIds[2] = Long.parseLong(row.get(11)); + if (row.get(12) != null && !row.get(12).trim().equals("")) + upperLevelIds[3] = Long.parseLong(row.get(12)); + if (row.get(13) != null && !row.get(13).trim().equals("")) + upperLevelIds[4] = Long.parseLong(row.get(13)); this.row = row; } + public void mapUpperLevels(Map index) { + for (int i = 0; i < level; i++) { + Long geonameId = upperLevelIds[i]; + upperLevels.add(i, index.get(geonameId)); + } + } + public Long getGeonameId() { return geonameId; } @@ -56,6 +80,14 @@ public class GeonamesAdm { return name; } + public String getName(Function transform) { + if (transform != null) + return transform.apply(name); + else + return name; + + } + public String getAsciiName() { return asciiName; } @@ -92,6 +124,18 @@ public class GeonamesAdm { return timeZone; } + public String getAdminCode1() { + return adminCode1; + } + + public Long[] getUpperLevelIds() { + return upperLevelIds; + } + + public List getUpperLevels() { + return upperLevels; + } + @Override public int hashCode() { return geonameId.intValue();