From: <nk...@us...> - 2010-07-21 23:01:21
|
Revision: 28091 http://tikiwiki.svn.sourceforge.net/tikiwiki/?rev=28091&view=rev Author: nkoth Date: 2010-07-21 23:01:15 +0000 (Wed, 21 Jul 2010) Log Message: ----------- [NEW] Ability to geocode items via categorization, e.g. if placed in country category "Spain" will geocode the location for Spain for the object... Modified Paths: -------------- trunk/lib/categories/categlib.php trunk/lib/prefs/category.php trunk/lib/setup/prefs.php trunk/templates/tiki-admin-include-category.tpl Added Paths: ----------- trunk/lib/geo/ trunk/lib/geo/geolib.php Modified: trunk/lib/categories/categlib.php =================================================================== --- trunk/lib/categories/categlib.php 2010-07-21 21:28:36 UTC (rev 28090) +++ trunk/lib/categories/categlib.php 2010-07-21 23:01:15 UTC (rev 28091) @@ -873,7 +873,12 @@ global $cachelib; include_once('lib/cache/cachelib.php'); global $prefs; if (!$categId) $categId = "0"; // avoid wrong cache - if( ! $ret = $cachelib->getSerialized("childcategs$categId") ) { + if ($all_descends) { + $cachekey = "allchildcategs$categId"; + } else { + $cachekey = "childcategs$categId"; + } + if( ! $ret = $cachelib->getSerialized("$cachekey") ) { if ($all_descends == true) { //find length of $categId name to delete later $name = $this->get_category_name($categId); @@ -1685,8 +1690,53 @@ $catObjectId = $this->add_categorized_object($objType, $objId, $desc, $name, $href); } + global $prefs; + if ($prefs["category_autogeocode_within"]) { + $geocats = $this->get_child_categories($prefs["category_autogeocode_within"], true); + } else { + $geocats = false; + } + foreach ($new_categories as $category) { $this->categorize($catObjectId, $category); + // Auto geocode if feature is on + if ($geocats) { + foreach ($geocats as $g) { + if ($category == $g["categId"]) { + $geonames = explode('::', $g["name"]); + $geonames = array_reverse($geonames); + $geoloc = implode(',', $geonames); + global $geolib; + if (!is_object($geolib)) { + include_once('lib/geo/geolib.php'); + } + $geocode = $geolib->geocode($geoloc); + if ($geocode) { + global $attributelib; + if (!is_object($attributelib)) { + include_once('lib/attributes/attributelib.php'); + } + if ($prefs["category_autogeocode_replace"] != 'y') { + $attributes = $attributelib->get_attributes( $objType, $objId ); + if ( !isset($attributes['tiki.geo.lon']) || !isset($attributes['tiki.geo.lat']) ) { + $geonotexists = true; + } + } + if ($prefs["category_autogeocode_replace"] == 'y' || isset($geonotexists) && $geonotexists) { + if ($prefs["category_autogeocode_fudge"] == 'y') { + $geocode = $geolib->geofudge($geocode); + } + $attributelib->set_attribute($objType, $objId, 'tiki.geo.lon', $geocode["lon"]); + $attributelib->set_attribute($objType, $objId, 'tiki.geo.lat', $geocode["lat"]); + if ($objType == 'trackeritem') { + $geolib->setTrackerGeo($objId, $geocode); + } + } + } + break; + } + } + } } foreach ($removed_categories as $category) { Added: trunk/lib/geo/geolib.php =================================================================== --- trunk/lib/geo/geolib.php (rev 0) +++ trunk/lib/geo/geolib.php 2010-07-21 23:01:15 UTC (rev 28091) @@ -0,0 +1,65 @@ +<?php + +class GeoLib +{ + + function geocode($where) { + global $prefs; + $where = stripslashes($where); + $whereurl = urlencode($where); + $googlekey = $prefs["gmap_key"]; + if (!$googlekey) { + return false; + } + $location = file("http://maps.google.com/maps/geo?q=$whereurl&output=csv&key=$googlekey"); + list ($stat,$acc,$north,$east) = explode(",",$location[0]); + $ret = array( + 'status' => $stat, + 'accuracy' => $acc, + 'lat' => $north, + 'lon' => $east, + ); + if ($stat != '200') { + return false; + } + return $ret; + } + + function geofudge($geo) { + if (!$geo) { + return false; + } + if (empty($geo["lon"]) || empty($geo["lat"])) { + return array("lon" => 0, "lat" => 0); + } + $geo["lon"] = $geo["lon"] + rand(0, 10000) / 8000; + $geo["lat"] = $geo["lat"] + rand(0, 10000) / 10000; + return $geo; + } + + function setTrackerGeo($itemId, $geo) { + global $prefs, $trklib; + if (!is_object($trklib)) { + include_once('lib/trackers/trackerlib.php'); + } + $item = $trklib->get_tracker_item($itemId); + $fields = $trklib->list_tracker_fields($item['trackerId']); + foreach ($fields["data"] as $f) { + if ($f["type"] == 'G' && $f["options_array"][0] == 'y') { + $fieldId = $f["fieldId"]; + $options_array = $f["options_array"]; + $pointx = $geo['lon']; + $pointy = $geo['lat']; + $pointz = $prefs["gmap_defaultz"]; + break; + } + } + if (isset($fieldId)) { + $ins_fields["data"][$fieldId] = array('fieldId' => $fieldId, 'options_array' => $options_array, 'value' => "$pointx,$pointy,$pointz", 'type' => 'G'); + $res = $trklib->replace_item($item['trackerId'], $itemId, $ins_fields); + } + } + +} + +$geolib = new GeoLib; \ No newline at end of file Modified: trunk/lib/prefs/category.php =================================================================== --- trunk/lib/prefs/category.php 2010-07-21 21:28:36 UTC (rev 28090) +++ trunk/lib/prefs/category.php 2010-07-21 23:01:15 UTC (rev 28091) @@ -42,6 +42,23 @@ 'filter' => 'digits', 'separator' => ',', ), + 'category_autogeocode_within' => array( + 'name' => tra('Automatically geocode items when categorized in'), + 'description' => tra('Automatically geocode items based on category name when categorized in the sub-categories of this category ID'), + 'type' => 'text', + 'filter' => 'digits', + 'size' => 3, + ), + 'category_autogeocode_replace' => array( + 'name' => tra('Replace existing geocode if any'), + 'description' => tra('When automatically geocoding items based on category name, replace existing geocode if any'), + 'type' => 'flag', + ), + 'category_autogeocode_fudge' => array( + 'name' => tra('Use approximate geocode location'), + 'description' => tra('When automatically geocoding items based on category name, use randomly approximated location instead of precise location'), + 'type' => 'flag', + ), ); } Modified: trunk/lib/setup/prefs.php =================================================================== --- trunk/lib/setup/prefs.php 2010-07-21 21:28:36 UTC (rev 28090) +++ trunk/lib/setup/prefs.php 2010-07-21 23:01:15 UTC (rev 28091) @@ -1189,6 +1189,9 @@ 'category_i18n_sync' => 'n', 'category_i18n_synced' => array(), 'category_i18n_unsynced' => array(), + 'category_autogeocode_within' => '', + 'category_autogeocode_replace' => 'n', + 'category_autogeocode_fudge' => 'n', 'expanded_category_jail' => '', 'expanded_category_jail_key' => '', 'ws_container' => 0, Modified: trunk/templates/tiki-admin-include-category.tpl =================================================================== --- trunk/templates/tiki-admin-include-category.tpl 2010-07-21 21:28:36 UTC (rev 28090) +++ trunk/templates/tiki-admin-include-category.tpl 2010-07-21 23:01:15 UTC (rev 28091) @@ -29,6 +29,9 @@ {preference name=categories_used_in_tpl} {preference name=category_jail} {preference name=category_defaults} + {preference name=category_autogeocode_within} + {preference name=category_autogeocode_replace} + {preference name=category_autogeocode_fudge} {preference name=category_i18n_sync} <div class="adminoptionboxchild category_i18n_sync_childcontainer blacklist whitelist required"> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |