+package org.argeo.support.geonames;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.argeo.util.CsvParser;
+import org.argeo.util.CsvWriter;
+
+/** Import GeoNames administrative division from the main table. */
+public class ImportGeonamesAdmin {
+ // private Log log = LogFactory.getLog(ImportGeonamesAdmin.class);
+ private Map<Long, GeonamesAdm> geonamesAdms = new HashMap<>();
+
+ /** Loads the data. */
+ public void parse(InputStream in) {
+ Map<String, Long> countryGeonameIds = new HashMap<>();
+ Map<String, Long> admin1GeonameIds = new HashMap<>();
+ CsvParser csvParser = new CsvParser() {
+
+ @Override
+ protected void processLine(Integer lineNumber, List<String> header, List<String> tokens) {
+ if (!"A".equals(tokens.get(6)))
+ return;
+ GeonamesAdm geonamesAdm = new GeonamesAdm(tokens);
+ geonamesAdms.put(geonamesAdm.getGeonameId(), geonamesAdm);
+ if (geonamesAdm.getAdmLevel().equals("PCLI"))
+ countryGeonameIds.put(geonamesAdm.getCountryCode(), geonamesAdm.getGeonameId());
+ if (geonamesAdm.getAdmLevel().equals("ADM1"))
+ admin1GeonameIds.put(geonamesAdm.getAdminCode1(), geonamesAdm.getGeonameId());
+ }
+ };
+ csvParser.setSeparator('\t');
+ csvParser.setNoHeader(true);
+ csvParser.parse(in, StandardCharsets.UTF_8);
+
+ // fill upper levels
+ for (GeonamesAdm adm : geonamesAdms.values()) {
+ adm.getUpperLevelIds()[0] = countryGeonameIds.get(adm.getCountryCode());
+ if (adm.getLevel() > 0)
+ adm.getUpperLevelIds()[1] = admin1GeonameIds.get(adm.getAdminCode1());
+ adm.mapUpperLevels(geonamesAdms);
+ }
+
+ }
+
+ public Map<Long, GeonamesAdm> getGeonamesAdms() {
+ return geonamesAdms;
+ }
+
+ /**
+ * Copies only the Geonames of feature class 'A' (administrative subdivisions).
+ */
+ public static void filterGeonamesAdm(InputStream in, OutputStream out) {
+ CsvWriter csvWriter = new CsvWriter(out, StandardCharsets.UTF_8);
+ csvWriter.setSeparator('\t');
+ CsvParser csvParser = new CsvParser() {
+
+ @Override
+ protected void processLine(Integer lineNumber, List<String> header, List<String> tokens) {
+ if (tokens.size() < 7 || !"A".equals(tokens.get(6)))
+ return;
+ csvWriter.writeLine(tokens);
+ }
+ };
+ csvParser.setSeparator('\t');
+ csvParser.setNoHeader(true);
+ csvParser.parse(in, StandardCharsets.UTF_8);
+ }
+
+ public static void main(String[] args) throws IOException {
+// String country = "allCountries";
+ String country = "CI";
+// try (InputStream in = Files
+// .newInputStream(Paths.get(System.getProperty("user.home") + "/gis/data/geonames/" + country + ".txt"));
+// OutputStream out = Files.newOutputStream(
+// Paths.get(System.getProperty("user.home") + "/gis/data/geonames/" + country + "-adm.txt"))) {
+// ImportGeonamesAdmin.filterGeonamesAdm(in, out);
+// }
+ try (InputStream in = Files.newInputStream(
+ Paths.get(System.getProperty("user.home") + "/gis/data/geonames/" + country + "-adm.txt"))) {
+ ImportGeonamesAdmin importGeonamesAdmin = new ImportGeonamesAdmin();
+ importGeonamesAdmin.parse(in);
+ }
+ }
+
+}