Geo
Rationale
Geo takes a locality-name and returns geo-info (longitude and lattitude). So far, so good you say; it's just a database lookup right? Well yes. But what if you have a longer string, say from a news item.
Say:
Bij een ontploffing op een recreatiepark in Ommel, gemeente Asten, is zondagochtend een 40-jarige Tilburger zwaargewond geraakt. De explosie van een gasfles verwoeste het gehele chalet en richtte ook grote schade aan aan omliggende huisjes. Een klein brandje dat door de ontploffing ontstond is door de brandweer geblust. Volgens de politie heeft het slachtoffer vermoedelijk geprobeerd zelfmoord te plegen. Hij is met ernstige 3e graads brandwonden overgebracht naar het brandwondencentrum in Beverwijk.
In here (and sorry this is a dutch example) are many placenames:
- Ommel
- Asten
- Tilburg(er)
- Beverwijk
So where did the accident happen? The answer is: Ommel, which is part of Asten, it happened to someone from Tilburg and he was brought to a hospital in Beverwijk.
To complicate matters: there are words like 'een' (one) or 'meer' (more) which are localities bust most likely part of the sentence with a different meaning.
Design
Geo uses a database-ish lookup mechanism (more on that later) and a TST (ternary search tree, or 'trie') for best-match.
Dependencies
Are in /thirdp
- tst for the match
- zziplib for the lookup
Example
From geo_unit_test.cpp
void test_find_most_likely() { #if 1 { std::wstring str(L"Bij een ontploffing op een recreatiepark in Ommel, gemeente Asten, is zondagochtend een 40-jarige Tilburger zwaargewond geraakt. De explosie van een gasfles verwoeste het gehele chalet en richtte ook grote schade aan aan omliggende huisjes. Een klein brandje dat door de ontploffing ontstond is door de brandweer geblust. Volgens de politie heeft het slachtoffer vermoedelijk geprobeerd zelfmoord te plegen. Hij is met ernstige 3e graads brandwonden overgebracht naar het brandwondencentrum in Beverwijk."); util::geo::gps::locations_t vec = find_most_likely(str); for(util::geo::gps::locations_t::const_iterator iter = vec.begin(); iter != vec.end(); ++iter) { std::wcout << iter->first << std::endl; } BOOST_CHECK_EQUAL(vec.size(), static_cast<std::size_t>(8)); BOOST_CHECK(vec[0].first == L"gemeente asten"); BOOST_CHECK(vec[1].first == L"beverwijk"); BOOST_CHECK(vec[2].first == L"ommel"); BOOST_CHECK(vec[3].first == L"een"); } #endif
Use
This is used in 2 sites, with upload, on the description entered - so new items automatically have geo-info
- www.abonja.nl
- http://www.regio112.nl/upload