Open Source PHP library for importing and employing a local instance of Yahoo GeoPlanet
Switch branches/tags
Nothing to show
Pull request Compare This branch is 94 commits behind twbell:master.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


 * @package gplplanet
 * @author Tyler Bell tylerwbell[at]gmail[dot]com
 * @copyright (C) 2009,2010 - Tyler Bell
 * @license GNU General Public License

GPLplanet: an open source PHP library to assist in employing local instances of Yahoo 
GeoPlanet(tm) in production. 
"Yahoo! GeoPlanet is a resource for managing all geo-permanent named places 
on Earth. It provides the geographic developer community with the vocabulary 
and grammar to describe the world's geography in an unequivocal, permanent, 
\and language-neutral manner. Developers can geo-enable their applications 
by using GeoPlanet to traverse the global spatial hierarchy, identify the 
geography relevant to their users and their businesses, and in turn, 
unambiguously geotag, geotarget, and geolocate data across the Web"

Yahoo makes GeoPlanet available as both a Web service and data download.  
Due to call-per-day restrictions or latency concerns, small businesses and 
startups are either unwilling or unable to create their core geographic 
platforms on Yahoo Web services.   This library uses a local version of 
GeoPlanet to obtain similar functionality, in a local environment, allowing 
developers easy access to GeoPlanet in a PHP class with access to Web services 
where required.  In a nutshell:

- Creates highly optimized (read: not normalized) MySQL geoplanet database
- Imports GeoPlanet TSV
- Provides PHP wrappers for getParents(), getChildren(), disambiguate() etc. methods
- Wraps geocode(), reverseGeocode(), and getElevation() calls (Web wervice only)
- Gets and caches coordinates for woeids (not supplied with data dump)
- Provides sample Web service scripts for deployment examples SaaS environments

These libraries are intended to make a local instance of GeoPlanet more accessible and easier to 
understand before implementing in production. If you are looking for a simple GeoPlanet
Web-service-only wrapper, see Tyler Hall's
$engine = geoengine::getInstance();             //geoengine is a factory singleton
$engine->disambiguate("springfield");           //the most likely 'Springfield'
$engine->getChildren(31278);                    //children of woeid 31278 (Oxford, UK)
$engine->getElevationByWOEID(2461928);          //elevation of woeid 2461928 (Northfield, MN)
$engine->getByName("springfield","UK");         //all places called "Springfield" in UK
$engine->geocode("1 infinity loop, Cupertino, ca"); //geocodes
$engine->reverseGeocode(0.151490,52.145329);    //reverse geocodes
$engine->getBbox(727232);                       //bounding box of Amsterdam
$engine->filterByType($engine->getDescendants(23424977),7); //all towns in US
$engine->getAdjacencies(2468964);               //all towns surrounding woeid 2468964 (Pasedena, CA)

class.geoengine.php         Core methods and factory class; instantiate as singleton
class.geoservice.php        Methods wrapping YQL calls; instantiated as singleton, when required, by geoengine
class.geo.php               Geo object representing named-place; instantiated as required by geoengine
import/class.import.php     Methods for tsv data import
import/import.php           Procedural script for importing tsv data
import/geo.sql              SQL script for creating database
config.ini                  Configurations incl. database connection
webservice/disambiguate.php Example script for getting most probably place of given name
webservice/navigate.php     Example script for obtaining parents, children, etc. from geoplanet
webservice/reversegeocode   Example script for reverse geocoding

(1) Add database vars to config.ini
(2) Download geoplanet data from
(3) Assign tsv filenames to the variables in import.php
(4) Run import.php from the command line (e.g. "php import.php")

Import Notes:
- Import status will be echoed
- Script takes several hours or even days, depending on processor
- 50GB HD space required for MySQL temporary tables during import process
- php.ini memory_limit +1GB
- MySQL max_allowed_packet required 20MB
- Largest array produced thereafter at runtime is just under 18MB (UK descendants)

- Siblings data optimization
- BelongTo service integration
- Name search JS code examples for as-you-type lookup