Merge remote-tracking branch 'origin/unstable' into testing
[gpl/argeo-suite.git] / org.argeo.app.core / src / org / argeo / app / geo / geonames / ImportGeonamesAdmin.java
diff --git a/org.argeo.app.core/src/org/argeo/app/geo/geonames/ImportGeonamesAdmin.java b/org.argeo.app.core/src/org/argeo/app/geo/geonames/ImportGeonamesAdmin.java
new file mode 100644 (file)
index 0000000..52456bb
--- /dev/null
@@ -0,0 +1,93 @@
+package org.argeo.app.geo.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);
+               }
+       }
+
+}