<artifactId>org.argeo.support.odk</artifactId>
<version>2.1.16-SNAPSHOT</version>
</dependency>
+ <dependency>
+ <groupId>org.argeo.suite</groupId>
+ <artifactId>org.argeo.support.geonames</artifactId>
+ <version>2.1.16-SNAPSHOT</version>
+ </dependency>
<!-- Base CMS distribution -->
<dependency>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
--- /dev/null
+/bin/
+/target/
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.argeo.support.geonames</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
--- /dev/null
+/MANIFEST.MF
--- /dev/null
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.argeo.suite</groupId>
+ <artifactId>knowledge</artifactId>
+ <version>2.1.16-SNAPSHOT</version>
+ <relativePath>..</relativePath>
+ </parent>
+ <artifactId>org.argeo.support.geonames</artifactId>
+ <name>Geonames support</name>
+ <packaging>jar</packaging>
+ <dependencies>
+ <dependency>
+ <groupId>org.argeo.commons</groupId>
+ <artifactId>org.argeo.cms</artifactId>
+ <version>${version.argeo-commons}</version>
+ </dependency>
+ </dependencies>
+</project>
--- /dev/null
+package org.argeo.support.geonames;
+
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.util.Arrays;
+import java.util.List;
+
+/** 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<String> alternateNames;
+ private Double lat;
+ private Double lng;
+ private LocalDate lastUpdated;
+ private ZoneId timeZone;
+
+ private List<String> row;
+
+ public GeonamesAdm() {
+ }
+
+ /** Initialise from a row in the main Geonames table. */
+ public GeonamesAdm(List<String> 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));
+ } else if (admLevel.equals("PCLI")) {
+ level = 0;
+ }
+ name = row.get(1);
+ asciiName = row.get(2);
+ alternateNames = Arrays.asList(row.get(3).split(","));
+ lat = Double.parseDouble(row.get(4));
+ lng = Double.parseDouble(row.get(5));
+ lastUpdated = LocalDate.parse(row.get(18));
+ timeZone = ZoneId.of(row.get(17));
+ this.row = row;
+ }
+
+ public Long getGeonameId() {
+ return geonameId;
+ }
+
+ public Integer getLevel() {
+ return level;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getAsciiName() {
+ return asciiName;
+ }
+
+ public List<String> getAlternateNames() {
+ return alternateNames;
+ }
+
+ public Double getLat() {
+ return lat;
+ }
+
+ public Double getLng() {
+ return lng;
+ }
+
+ public String getCountryCode() {
+ return countryCode;
+ }
+
+ public String getAdmLevel() {
+ return admLevel;
+ }
+
+ public List<String> getRow() {
+ return row;
+ }
+
+ public LocalDate getLastUpdated() {
+ return lastUpdated;
+ }
+
+ public ZoneId getTimeZone() {
+ return timeZone;
+ }
+
+ @Override
+ public int hashCode() {
+ return geonameId.intValue();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof GeonamesAdm))
+ return false;
+ GeonamesAdm other = (GeonamesAdm) obj;
+ return geonameId.equals(other.geonameId);
+ }
+
+ @Override
+ public String toString() {
+ return name + " (ADM" + level + " " + geonameId + ")";
+ }
+
+}
--- /dev/null
+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) {
+ 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);
+// String featureName = tokens.get(7);
+// String geonameId = tokens.get(0);
+// String name = tokens.get(1);
+// Double lat = Double.parseDouble(tokens.get(4));
+// Double lng = Double.parseDouble(tokens.get(5));
+// switch (featureName) {
+// case "ADM1":
+// case "ADM4":
+// String adminCode1 = tokens.get(10);
+// System.out.println(
+// geonameId + " " + featureName + " " + lat + "," + lng + " " + adminCode1 + " " + name);
+// break;
+// default:
+// break;
+// }
+
+ }
+ };
+ csvParser.setSeparator('\t');
+ csvParser.setNoHeader(true);
+ csvParser.parse(in, StandardCharsets.UTF_8);
+ }
+
+ 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);
+// }
+ }
+
+}
<packaging>pom</packaging>
<modules>
<module>org.argeo.support.odk</module>
+ <module>org.argeo.support.geonames</module>
</modules>
</project>