17 September 2005 * * @package webtrees * @subpackage GoogleMap * @see config.php * $Id$ */ if (!defined('WT_WEBTREES')) { header('HTTP/1.0 403 Forbidden'); exit; } require WT_ROOT.'modules/googlemap/defaultconfig.php'; if (isset($_REQUEST['action'])) $action=$_REQUEST['action']; if (isset($_REQUEST['parent'])) $parent=$_REQUEST['parent']; if (isset($_REQUEST['display'])) $display=$_REQUEST['display']; if (isset($_REQUEST['mode'])) $mode=$_REQUEST['mode']; if (isset($_REQUEST['deleteRecord'])) $deleteRecord=$_REQUEST['deleteRecord']; if (!isset($action)) $action=""; if (!isset($parent)) $parent=0; if (!isset($display)) $display=""; // Take a place id and find its place in the hierarchy // Input: place ID // Output: ordered array of id=>name values, starting with the Top Level // e.g. array(0=>"Top Level", 16=>"England", 19=>"London", 217=>"Westminster"); // NB This function exists in both places.php and places_edit.php function place_id_to_hierarchy($id) { global $TBLPREFIX; $statement= WT_DB::prepare("SELECT pl_parent_id, pl_place FROM {$TBLPREFIX}placelocation WHERE pl_id=?"); $arr=array(); while ($id!=0) { $row=$statement->execute(array($id))->fetchOneRow(); $arr=array($id=>$row->pl_place)+$arr; $id=$row->pl_parent_id; } return $arr; } // NB This function exists in both places.php and places_edit.php function getHighestIndex() { global $TBLPREFIX; return (int)WT_DB::prepare("SELECT MAX(pl_id) FROM {$TBLPREFIX}placelocation")->fetchOne(); } function getHighestLevel() { global $TBLPREFIX; return (int)WT_DB::prepare("SELECT MAX(pl_level) FROM {$TBLPREFIX}placelocation")->fetchOne(); } /** * Find all of the places in the hierarchy */ function get_place_list_loc($parent_id) { global $display, $TBLPREFIX; if ($display=="inactive") { $rows= WT_DB::prepare("SELECT pl_id, pl_place, pl_lati, pl_long, pl_zoom, pl_icon FROM {$TBLPREFIX}placelocation WHERE pl_parent_id=? ORDER BY pl_place") ->execute(array($parent_id)) ->fetchAll(); } else { $rows= WT_DB::prepare( "SELECT DISTINCT pl_id, pl_place, pl_lati, pl_long, pl_zoom, pl_icon". " FROM {$TBLPREFIX}placelocation". " INNER JOIN {$TBLPREFIX}places ON {$TBLPREFIX}placelocation.pl_place={$TBLPREFIX}places.p_place AND {$TBLPREFIX}placelocation.pl_level={$TBLPREFIX}places.p_level". " WHERE pl_parent_id=? ORDER BY pl_place" ) ->execute(array($parent_id)) ->fetchAll(); } $placelist=array(); foreach ($rows as $row) { $placelist[]=array("place_id"=>$row->pl_id, "place"=>$row->pl_place, "lati"=>$row->pl_lati, "long"=>$row->pl_long, "zoom"=>$row->pl_zoom, "icon"=>$row->pl_icon); } uasort($placelist, "placesort"); return $placelist; } function outputLevel($parent_id) { global $TBLPREFIX; $tmp = place_id_to_hierarchy($parent_id); $maxLevel = getHighestLevel(); if ($maxLevel>8) $maxLevel = 8; $prefix = implode(';', $tmp); if ($prefix!='') $prefix.=';'; $suffix=str_repeat(';', $maxLevel-count($tmp)); $level=count($tmp); $rows= WT_DB::prepare("SELECT pl_id, pl_place, pl_long, pl_lati, pl_zoom, pl_icon FROM {$TBLPREFIX}placelocation WHERE pl_parent_id=? ORDER BY pl_place") ->execute(array($parent_id)) ->fetchAll(); foreach ($rows as $row) { echo "{$level};{$prefix}{$row->pl_place}{$suffix};{$row->pl_long};{$row->pl_lati};{$row->pl_zoom};{$row->pl_icon}\r\n"; if ($level < $maxLevel) outputLevel($row->pl_id); } } /** * recursively find all of the csv files on the server * * @param string $path */ function findFiles($path) { global $placefiles; if (file_exists($path)) { $dir = dir($path); while (false !== ($entry = $dir->read())) { if ($entry!="." && $entry!=".." && $entry!=".svn") { if (is_dir($path."/".$entry)) { findFiles($path."/".$entry); } elseif (strstr($entry, ".csv")!==false) { $placefiles[] = preg_replace("~modules/googlemap/extra~", "", $path)."/".$entry; } } } $dir->close(); } } if (!WT_USER_IS_ADMIN) { echo "".i18n::translate('Edit geographic place locations')."

"; echo "\n"; echo "
", i18n::translate('Page only for Administrators'); echo "
\n"; echo "


\n"; print_footer(); exit; } global $GOOGLEMAP_MAX_ZOOM; if ($action=="ExportFile" && WT_USER_IS_ADMIN) { $tmp = place_id_to_hierarchy($parent); $maxLevel = getHighestLevel(); if ($maxLevel>8) $maxLevel=8; $tmp[0] = "places"; $outputFileName=preg_replace('/[:;\/\\\(\)\{\}\[\] $]/', '_', implode('-', $tmp)).'.csv'; header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="'.$outputFileName.'"'); echo "\"".i18n::translate('Level')."\";\"".i18n::translate('Country')."\";"; if ($maxLevel>0) echo '"', i18n::translate('State'), '";'; if ($maxLevel>1) echo '"', i18n::translate('County'), '";'; if ($maxLevel>2) echo '"', i18n::translate('City'), '";'; if ($maxLevel>3) echo '"', i18n::translate('Place'), '";'; if ($maxLevel>4) echo '"', i18n::translate('Place'), '";'; if ($maxLevel>5) echo '"', i18n::translate('Place'), '";'; if ($maxLevel>6) echo '"', i18n::translate('Place'), '";'; if ($maxLevel>7) echo '"', i18n::translate('Place'), '";'; echo '"', i18n::translate('Longitude'), '";"', i18n::translate('Latitude'), '";'; echo '"', i18n::translate('Zoom factor'), '";"', i18n::translate('Icon'), WT_EOL; outputLevel($parent); exit; } print_header(i18n::translate('Edit geographic place locations')); if ($action=="ImportGedcom") { $placelist=array(); $j=0; if ($mode=="all") { $statement= WT_DB::prepare("SELECT i_gedcom FROM {$TBLPREFIX}individuals UNION ALL SELECT f_gedcom FROM {$TBLPREFIX}families") ->execute(); } else { $statement= WT_DB::prepare("SELECT i_gedcom FROM {$TBLPREFIX}individuals WHERE i_file=? UNION ALL SELECT f_gedcom FROM {$TBLPREFIX}families WHERE f_file=?") ->execute(array(WT_GED_ID, WT_GED_ID)); } while ($gedrec=$statement->fetchColumn()) { $i = 1; $placerec = get_sub_record(2, "2 PLAC", $gedrec, $i); while (!empty($placerec)) { if (preg_match("/2 PLAC (.+)/", $placerec, $match)) { $placelist[$j] = array(); $placelist[$j]["place"] = trim($match[1]); if (preg_match("/4 LATI (.*)/", $placerec, $match)) { $placelist[$j]["lati"] = trim($match[1]); if (($placelist[$j]["lati"][0] != "N") && ($placelist[$j]["lati"][0] != "S")) { if ($placelist[$j]["lati"] < 0) { $placelist[$j]["lati"][0] = "S"; } else { $placelist[$j]["lati"] = "N".$placelist[$j]["lati"]; } } } else $placelist[$j]["lati"] = "0"; if (preg_match("/4 LONG (.*)/", $placerec, $match)) { $placelist[$j]["long"] = trim($match[1]); if (($placelist[$j]["long"][0] != "E") && ($placelist[$j]["long"][0] != "W")) { if ($placelist[$j]["long"] < 0) { $placelist[$j]["long"][0] = "W"; } else { $placelist[$j]["long"] = "E".$placelist[$j]["long"]; } } } else $placelist[$j]["long"] = "0"; $j = $j + 1; } $i = $i + 1; $placerec = get_sub_record(2, "2 PLAC", $gedrec, $i); } } asort($placelist); $prevPlace = ""; $prevLati = ""; $prevLong = ""; $placelistUniq = array(); $j = 0; foreach ($placelist as $k=>$place) { if ($place["place"] != $prevPlace) { $placelistUniq[$j] = array(); $placelistUniq[$j]["place"] = $place["place"]; $placelistUniq[$j]["lati"] = $place["lati"]; $placelistUniq[$j]["long"] = $place["long"]; $j = $j + 1; } else if (($place["place"] == $prevPlace) && (($place["lati"] != $prevLati) || ($place["long"] != $prevLong))) { if (($placelistUniq[$j-1]["lati"] == 0) || ($placelistUniq[$j-1]["long"] == 0)) { $placelistUniq[$j-1]["lati"] = $place["lati"]; $placelistUniq[$j-1]["long"] = $place["long"]; } else if (($place["lati"] != "0") || ($place["long"] != "0")) { echo "Verscil: vorige waarde = $prevPlace, $prevLati, $prevLong, huidige = ", $place["place"], ", ", $place["lati"], ", ", $place["long"], "
"; } } $prevPlace = $place["place"]; $prevLati = $place["lati"]; $prevLong = $place["long"]; } $highestIndex = getHighestIndex(); $default_zoom_level=array(4, 7, 10, 12); foreach ($placelistUniq as $k=>$place) { $parent=preg_split('/ *, */', $place["place"]); $parent=array_reverse($parent); $parent_id=0; for($i=0; $iexecute(array($i, $parent_id, $escparent)) ->fetchOneRow(); if ($i < count($parent)-1) { // Create higher-level places, if necessary if (empty($row)) { $highestIndex++; WT_DB::prepare("INSERT INTO {$TBLPREFIX}placelocation (pl_id, pl_parent_id, pl_level, pl_place, pl_zoom) VALUES (?, ?, ?, ?, ?)") ->execute(array($highestIndex, $parent_id, $i, $escparent, $default_zoom_level[$i])); echo htmlspecialchars($escparent), '
'; $parent_id=$highestIndex; } else { $parent_id=$row->pl_id; } } else { // Create lowest-level place, if necessary if (empty($row->pl_id)) { $highestIndex++; WT_DB::prepare("INSERT INTO {$TBLPREFIX}placelocation (pl_id, pl_parent_id, pl_level, pl_place, pl_long, pl_lati, pl_zoom) VALUES (?, ?, ?, ?, ?, ?, ?)") ->execute(array($highestIndex, $parent_id, $i, $escparent, $place["long"], $place["lati"], $default_zoom_level[$i])); echo htmlspecialchars($escparent), '
'; } else { if (empty($row->pl_long) && empty($row->pl_lati) && $place['lati']!="0" && $place['long']!="0") { WT_DB::prepare("UPDATE {$TBLPREFIX}placelocation SET pl_lati=?, pl_long=? WHERE pl_id=?") ->execute(array($place["lati"], $place["long"], $row->pl_id)); echo htmlspecialchars($escparent), '
'; } } } } } $parent=0; } if ($action=="ImportFile") { $placefiles = array(); findFiles("modules/googlemap/extra"); sort($placefiles); ?>
0) { ?>

$value) { $country_names[$key]=i18n::translate($key); } if (isset($_POST["cleardatabase"])) { WT_DB::exec("DELETE FROM {$TBLPREFIX}placelocation WHERE 1=1"); } if (!empty($_FILES["placesfile"]["tmp_name"])) { $lines = file($_FILES["placesfile"]["tmp_name"]); } elseif (!empty($_REQUEST['localfile'])) { $lines = file("modules/googlemap/extra".$_REQUEST['localfile']); } // Strip BYTE-ORDER-MARK, if present if (!empty($lines[0]) && substr($lines[0], 0, 3)==WT_UTF8_BOM) $lines[0]=substr($lines[0], 3); asort($lines); $highestIndex = getHighestIndex(); $placelist = array(); $j = 0; $maxLevel = 0; foreach ($lines as $p => $placerec){ $fieldrec = explode(';', $placerec); if($fieldrec[0] > $maxLevel) $maxLevel = $fieldrec[0]; } $fields = count($fieldrec); foreach ($lines as $p => $placerec){ $fieldrec = explode(';', $placerec); if (is_numeric($fieldrec[0]) && $fieldrec[0]<=$maxLevel) { $placelist[$j] = array(); $placelist[$j]["place"] = ""; for ($ii=$fields-4; $ii>1; $ii--) { if ($fieldrec[0] > $ii-2) $placelist[$j]["place"] .= $fieldrec[$ii].","; } foreach ($country_names as $countrycode => $countryname) { if ($countrycode == strtoupper($fieldrec[1])) { $fieldrec[1] = $countryname; break; } } $placelist[$j]["place"] .= $fieldrec[1]; $placelist[$j]["long"] = $fieldrec[$fields-4]; $placelist[$j]["lati"] = $fieldrec[$fields-3]; $placelist[$j]["zoom"] = $fieldrec[$fields-2]; $placelist[$j]["icon"] = trim($fieldrec[$fields-1]); $j = $j + 1; } } $prevPlace = ""; $prevLati = ""; $prevLong = ""; $placelistUniq = array(); $j = 0; foreach ($placelist as $k=>$place) { if ($place["place"] != $prevPlace) { $placelistUniq[$j] = array(); $placelistUniq[$j]["place"] = $place["place"]; $placelistUniq[$j]["lati"] = $place["lati"]; $placelistUniq[$j]["long"] = $place["long"]; $placelistUniq[$j]["zoom"] = $place["zoom"]; $placelistUniq[$j]["icon"] = $place["icon"]; $j = $j + 1; } else if (($place["place"] == $prevPlace) && (($place["lati"] != $prevLati) || ($place["long"] != $prevLong))) { if (($placelistUniq[$j-1]["lati"] == 0) || ($placelistUniq[$j-1]["long"] == 0)) { $placelistUniq[$j-1]["lati"] = $place["lati"]; $placelistUniq[$j-1]["long"] = $place["long"]; $placelistUniq[$j-1]["zoom"] = $place["zoom"]; $placelistUniq[$j-1]["icon"] = $place["icon"]; } else if (($place["lati"] != "0") || ($place["long"] != "0")) { echo "Differenc: last value = $prevPlace, $prevLati, $prevLong, current = ", $place["place"], ", ", $place["lati"], ", ", $place["long"], "
"; } } $prevPlace = $place["place"]; $prevLati = $place["lati"]; $prevLong = $place["long"]; } $default_zoom_level = array(); $default_zoom_level[0] = 4; $default_zoom_level[1] = 7; $default_zoom_level[2] = 10; $default_zoom_level[3] = 12; foreach ($placelistUniq as $k=>$place) { $parent = explode(',', $place["place"]); $parent = array_reverse($parent); $parent_id=0; for($i=0; $iexecute(array($i, $parent_id, $escparent)) ->fetchOneRow(); if (empty($row)) { // this name does not yet exist: create entry if (!isset($_POST["updateonly"])) { $highestIndex = $highestIndex + 1; if (($i+1) == count($parent)) { $zoomlevel = $place["zoom"]; } elseif (isset($default_zoom_level[$i])) { $zoomlevel = $default_zoom_level[$i]; } else { $zoomlevel = $GOOGLEMAP_MAX_ZOOM; } if (($place["lati"] == "0") || ($place["long"] == "0") || (($i+1) < count($parent))) { WT_DB::prepare("INSERT INTO {$TBLPREFIX}placelocation (pl_id, pl_parent_id, pl_level, pl_place, pl_zoom, pl_icon) VALUES (?, ?, ?, ?, ?, ?)") ->execute(array($highestIndex, $parent_id, $i, $escparent, $zoomlevel, $place["icon"])); } else { //delete leading zero $pl_lati = str_replace(array('N', 'S', ','), array('', '-', '.') , $place["lati"]); $pl_long = str_replace(array('E', 'W', ','), array('', '-', '.') , $place["long"]); if ($pl_lati >= 0) { $place["lati"] = "N".abs($pl_lati); } elseif ($pl_lati < 0) { $place["lati"] = "S".abs($pl_lati); } if ($pl_long >= 0) { $place["long"] = "E".abs($pl_long); } elseif ($pl_long < 0) { $place["long"] = "W".abs($pl_long); } WT_DB::prepare("INSERT INTO {$TBLPREFIX}placelocation (pl_id, pl_parent_id, pl_level, pl_place, pl_long, pl_lati, pl_zoom, pl_icon) VALUES (?, ?, ?, ?, ?, ?, ?, ?)") ->execute(array($highestIndex, $parent_id, $i, $escparent, $place["long"], $place["lati"], $zoomlevel, $place["icon"])); } $parent_id = $highestIndex; } } else { $parent_id = $row->pl_id; if ((isset($_POST["overwritedata"])) && ($i+1 == count($parent))) { WT_DB::prepare("UPDATE {$TBLPREFIX}placelocation SET pl_lati=?, pl_long=?, pl_zoom=?, pl_icon=? WHERE pl_id=?") ->execute(array($place["lati"], $place["long"], $place["zoom"], $place["icon"], $parent_id)); } else { if ((($row->pl_long == "0") || ($row->pl_long == null)) && (($row->pl_lati == "0") || ($row->pl_lati == null))) { WT_DB::prepare("UPDATE {$TBLPREFIX}placelocation SET pl_lati=?, pl_long=? WHERE pl_id=?") ->execute(array($place["lati"], $place["long"], $parent_id)); } if (empty($row->pl_icon) && !empty($place['icon'])) { WT_DB::prepare("UPDATE {$TBLPREFIX}placelocation SET pl_icon=? WHERE pl_id=?") ->execute(array($place["icon"], $parent_id)); } } } } } $parent=0; } if ($action=="DeleteRecord") { $exists= WT_DB::prepare("SELECT 1 FROM {$TBLPREFIX}placelocation WHERE pl_parent_id=?") ->execute(array($deleteRecord)) ->fetchOne(); if (!$exists) { WT_DB::prepare("DELETE FROM {$TBLPREFIX}placelocation WHERE pl_id=?") ->execute(array($deleteRecord)); } else { echo "
".i18n::translate('Location not removed: this location contains sub-locations')."
"; } } ?> ".i18n::translate('Edit geographic place locations').": "; $where_am_i=place_id_to_hierarchy($parent); foreach (array_reverse($where_am_i, true) as $id=>$place) { if ($id==$parent) { if ($place != "Unknown") { echo PrintReady($place); } else { echo i18n::translate('Unknown'); } } else { echo ""; if ($place != "Unknown") { echo PrintReady($place), ""; } else { echo i18n::translate('Unknown'), ""; } } echo " - "; } echo "".i18n::translate('Top Level').""; echo "

"; echo "\n
", i18n::translate('Click here to show inactive places'), ": \n"; echo help_link('PLE_ACTIVE','googlemap'); echo "
"; echo "
"; $placelist=get_place_list_loc($parent); echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; if (count($placelist) == 0) echo ""; foreach ($placelist as $place) { echo ""; else echo i18n::translate('Unknown'), ""; echo ""; echo ""; echo ""; echo ""; echo ""; $noRows= WT_DB::prepare("SELECT COUNT(pl_id) FROM {$TBLPREFIX}placelocation WHERE pl_parent_id=?") ->execute(array($place["place_id"])) ->fetchOne(); if ($noRows==0) { ?>
", i18n::translate('PLAC'), "", i18n::translate('LATI'), "", i18n::translate('LONG'), "".i18n::translate('Zoom factor')."".i18n::translate('Icon').""; echo help_link('PL_EDIT_LOCATION','googlemap'); echo i18n::translate('Edit geographic location'), "
", i18n::translate('No places found'), "
"; if ($place["place"] != "Unknown") echo PrintReady($place["place"]), "{$place['lati']}{$place['long']}{$place['zoom']}"; if (($place["icon"] == NULL) || ($place["icon"] == "")) { if (($place['lati'] == NULL) || ($place['long'] == NULL) || (($place['lati'] == "0") && ($place['long'] == "0"))) { echo " "; echo ""; } else { echo " "; echo ""; } } else { echo ""; } echo "", i18n::translate('Edit'), "";?><?php echo i18n::translate('Remove');?>
"; echo i18n::translate('Export current view to file'), ""; echo help_link('PL_EXPORT_FILE','googlemap'); } else { echo " "; } echo ""; echo ""; echo i18n::translate('Export all locations to file'), ""; echo help_link('PL_EXPORT_ALL_FILE','googlemap'); echo "

"; if(empty($SEARCH_SPIDER)) print_footer(); else { echo i18n::translate('Search Engine Spider Detected'), ": ", $SEARCH_SPIDER; echo "\n\n\t\n"; } ?>