aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Dirk Hohndel <dirk@hohndel.org>2015-07-10 09:51:50 -0700
committerGravatar Dirk Hohndel <dirk@hohndel.org>2015-07-10 09:51:50 -0700
commitbda482a30a7ee526cb381bb3583f87fe86b7845f (patch)
tree985b9adfa376f605e0bb03421c83107414733763
parenta0f88e4c9fe5a7881dffb15d8ec4878a81d563b1 (diff)
downloadsubsurface-bda482a30a7ee526cb381bb3583f87fe86b7845f.tar.gz
Geo taxonomy: add higher level notion of city
This renames the local name for the location as town and adds the concept of a city as the level 3 admin category. In some regions (e.g. at times in Italy) the local hamlet name is shown as toponymName but the name of the actual city is given as adminName3. With this change "city" will always reflect our best guess: adminName3 if it exists, otherwise the toponymName. Whereas "town" is always the toponymName. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r--divesitehelpers.cpp17
-rw-r--r--taxonomy.c4
-rw-r--r--taxonomy.h3
3 files changed, 21 insertions, 3 deletions
diff --git a/divesitehelpers.cpp b/divesitehelpers.cpp
index 1f323a537..775951855 100644
--- a/divesitehelpers.cpp
+++ b/divesitehelpers.cpp
@@ -85,7 +85,7 @@ void ReverseGeoLookupThread::run() {
QVariantList geoNames = geoNamesObject.toList();
if (geoNames.count() > 0) {
QVariantMap firstData = geoNames.at(0).toMap();
- int ri = 0;
+ int ri = 0, l3 = -1, lt = -1;
if (ds->taxonomy.category == NULL)
ds->taxonomy.category = alloc_taxonomy();
// get all the data - OCEAN is special, so start at COUNTRY
@@ -98,6 +98,21 @@ void ReverseGeoLookupThread::run() {
ri++;
}
}
+ for (int j = ri - 1; j >= 0; j--) {
+ if (ds->taxonomy.category[j].category == TC_ADMIN_L3)
+ l3 = j;
+ else if (ds->taxonomy.category[j].category == TC_LOCALNAME)
+ lt = j;
+ }
+ if (l3 == -1 && lt != -1) {
+ // basically this means we did get a local name (what we call town), but just like most places
+ // we didn't get an adminName_3 - which in some regions is the actual city that town belongs to,
+ // then we copy the town into the city
+ ds->taxonomy.category[ri].value = copy_string(ds->taxonomy.category[lt].value);
+ ds->taxonomy.category[ri].origin = taxonomy::COPIED;
+ ds->taxonomy.category[ri].category = TC_ADMIN_L3;
+ ri++;
+ }
ds->taxonomy.nr = ri;
mark_divelist_changed(true);
} else {
diff --git a/taxonomy.c b/taxonomy.c
index 2b71648c1..b72616faf 100644
--- a/taxonomy.c
+++ b/taxonomy.c
@@ -8,6 +8,7 @@ char *taxonomy_category_names[TC_NR_CATEGORIES] = {
QT_TRANSLATE_NOOP("getTextFromC", "Country"),
QT_TRANSLATE_NOOP("getTextFromC", "State"),
QT_TRANSLATE_NOOP("getTextFromC", "County"),
+ QT_TRANSLATE_NOOP("getTextFromC", "Town"),
QT_TRANSLATE_NOOP("getTextFromC", "City")
};
@@ -18,7 +19,8 @@ char *taxonomy_api_names[TC_NR_CATEGORIES] = {
"countryName",
"adminName1",
"adminName2",
- "toponymName"
+ "toponymName",
+ "adminName3"
};
struct taxonomy *alloc_taxonomy()
diff --git a/taxonomy.h b/taxonomy.h
index b6a062a08..9831cfe19 100644
--- a/taxonomy.h
+++ b/taxonomy.h
@@ -12,6 +12,7 @@ enum taxonomy_category {
TC_ADMIN_L1,
TC_ADMIN_L2,
TC_LOCALNAME,
+ TC_ADMIN_L3,
TC_NR_CATEGORIES
};
@@ -21,7 +22,7 @@ extern char *taxonomy_api_names[TC_NR_CATEGORIES];
struct taxonomy {
int category; /* the category for this tag: ocean, country, admin_l1, admin_l2, localname, etc */
const char *value; /* the value returned, parsed, or manually entered for that category */
- enum { GEOCODED, PARSED, MANUAL } origin;
+ enum { GEOCODED, PARSED, MANUAL, COPIED } origin;
};
/* the data block contains 3 taxonomy structures - unused ones have a tag value of NONE */