Wikivoyage:Quelltext von geodata.php

Index > Dokumentation > PHP-Kartentools > Quelltext von geodata.php

Im Folgenden findet sich der Quelltext von geodata.php vom Nutzer Mey2008 in der Fassung vom 3. Oktober 2017.

<!DOCTYPE html>
<head>
  <title>Wikivoyage - Geodata</title>
  <meta charset="utf-8">
</head>
<body>
<?php
/*
Geodata - version 2017-10-03

Author:
  https://de.wikivoyage.org/wiki/User:Mey2008
Contributors:
  https://it.wikivoyage.org/wiki/Utente:Andyrom75
License: 
  Affero GPL v3 or later http://www.gnu.org/licenses/agpl-3.0.html
Recent changes:
  2017-10-03: set_time_limit(480)
  2017-08-01: other geteilt in other1 un other2
  2016-12-03: + fi
  2016-08-21: spezial script f0r zh
  2016-04-18: copy data files first (ssl error)
  2015-07-26: preg_match bug -> page[0] error
  2015-04-28: he: תמונה =
  2015-04-19: sv now lat/long from quickbar
  2015-03-22: lat + long test zero or > 90 / 180
  2015-03-17: all data in nn.articles.js
  2015-03-16: article.js + photo
ToDo:
  --
*/

// PHP error reporting
error_reporting (E_ALL | E_STRICT);
ini_set ('display_errors' , 1);

// DMS to DEC (DIR must be N, E, S or, W)
function DMStoDEC($dms) {
  $part = preg_split("/[^\d\w\.]+/",$dms);
  $pnr = count($part);
  if ($pnr == 3) {
    $part[3] = $part[2];
    $part[2] = 0;
  }
  elseif ($pnr == 2) {
    $part[3] = $part[1];
    $part[1] = 0;
    $part[2] = 0;
  } 
  $dec = $part[0] + ((($part[1]*60) + ($part[2]))/3600);
  if ($part[3] == "S" || $part[3] == "W") {
    $dec = $dec * -1;
  } 
  return $dec;
}

$group = $_GET["group"];

if ($group == "de") {
  $lang = array("de");
}
elseif ($group == "en") {
  $lang = array("en");
}
elseif ($group == "other1") {
  $lang = array("el","es","fa","fi","fr","he");
}
elseif ($group == "other2") {
  $lang = array("it","nl","pl","pt","ro","ru","sv","uk","vi","zh");
}
else {
  $lang = array($group); // single language 
}

// clear geodata.log all 2 hours
if (time() - filemtime("geodata.log") > 7200) {
  $handle = fopen("geodata.log", "w");
  fclose($handle); 
}

for($i = 0; $i < count($lang); $i++) {
  error_log("\n" . $lang[$i] . " - " . date("Y-m-d - H:i:s") . " ----\n", 3, "geodata.log");
  set_time_limit(480);
  $content = "";
  $file = "http://dumps.wikimedia.org/" . $lang[$i] . "wikivoyage/latest/" . $lang[$i] . "wikivoyage-latest-pages-articles.xml.bz2";
  copy ($file, "articles.bz2");
  $file = "articles.bz2";

  $bz = bzopen($file, "r") or die("$file could not be opened for reading");

  // specific script "fr" & "it" & "sv"(no geo template)
  if($lang[$i] == "fr" || $lang[$i] == "it" || $lang[$i] == "sv") {
    while (!feof($bz)) {
      $content .= bzread($bz, 4096);
    }
  } 
  else {
    while (!feof($bz)) {
      $line = fgets($bz);
      if (stripos($line,"{geo") !== false) {
        $line = str_ireplace(" ","",$line);
        $content = $content . $line;
      }
      elseif (stripos($line, ".jpg") !== false || stripos($line,"<title>") !== false || stripos($line,"<ns>") !== false ||  stripos($line, "</page>") !== false){
        $content = $content . $line;
      }
    }
  }

  bzclose($bz);

  // specific script de
  if($lang[$i] == "de") {
    $content = str_ireplace(array('Geo|Breite', 'geodata', 'lat=', 'long='), array('', 'geo', '', ''), $content);
  }

  // specific script fr
  if($lang[$i] == "fr") {
    $content = preg_replace('/latitude\s*?=\s*?([.,\-,0-9]+)\s*?\|\s*?longitude\s*=\s*?([.,\-,0-9]+)/i', "{{Geo|$1|$2}}\n", $content);
  }
  
  // specific script it
  if($lang[$i] == "it") {
    $content = str_ireplace(array('&quot;', '&lt;!--Latitudine--&gt;', '&lt;!--Longitudine--&gt;', "′", '″'), array('"', '', '', "'", '"'), $content);
    $content = preg_replace('/Lat(?: *)=(?: *)(.*)\n\|(?: *)Long(?: *)=(?: *)(.*)\n/i', '{{Geo|$1|$2}}', $content);
  } 
  
   // specific script sv
  if($lang[$i] == "sv") {
    $content = str_ireplace(array('&quot;', '&lt;!--Latitud--&gt;', '&lt;!--Longitud--&gt;', "′", '″'), array('"', '', '', "'", '"'), $content);
    $content = preg_replace('/Lat(?: *)=(?: *)(.*)\n\|(?: *)Long(?: *)=(?: *)(.*)\n/i', '{{Geo|$1|$2}}', $content);
  }
  
  // specific script zh
  if($lang[$i] == "zh") {
    $content = str_ireplace(array('北纬', '东经' ), array('', ''), $content);
  }

  // change special strings (workaround)
  $content = str_ireplace(array("}}}}", "after.jpg"), array("}}", "after.xxx"), $content);

  // strip spaces, comments and nowiki
  $content = preg_replace(array('@\s*?=\s*@', '@\s*?:\s*@', '/(?:<!--(?:.|\s)*?-->)/', '/(?:<nowiki(?:.|\s)*?nowiki>)/' ), array('=', ':', 'C', 'N'), $content);

  // translate image tags
  $content = str_ireplace(array('Tiedosto:', 'Plik:', 'grafika=', 'imagem:', 'Ficheiro:', 'Изображение:', 'Afbeelding:', 'Fichier:', 'Bestand:', 'Fișier:', 'Fil:', 'Immagine=', 'Image:', 'קובץ:', 'תמונה=', 'imagen=', 'Tập tin:', 'Файл:', 'Bild:', 'widok=', 'File:', 'Datei:'), 'Image=', $content);

  // echo "<xmp>" . $content . "</xmp>"; // *** TEST ***

  preg_match_all("/(<title>(.*)<\/title>|<ns>(.*)<\/ns>|{{geo\s*?\|(.*)}}|{{geodata\s*?\|(.*)}})/i", $content, $matches);

  // print_r($matches); // *** TEST ***

  $rows = (count($matches,1) / count($matches,0)) - 1;
  $fp = fopen("./data/" . $lang[$i] . "-articles.js","wb+");
  fwrite($fp, "var addressPoints = [\n");
  for($m = 1; $m <= $rows - 1; $m++) {
    if ($matches[3][$m-1] == "0" && strpos($matches[4][$m],"|") != 0) {
      $teile = explode("|", $matches[4][$m]);
      if (strpos($teile[0], "°")) {
        $teile[0] = DMStoDEC($teile[0]);
      }
      if (strpos($teile[1], "°")) {
        $teile[1] = DMStoDEC($teile[1]);
      }
      $teile[0] = trim($teile[0]);
      $teile[1] = trim($teile[1]);
      if(!is_numeric($teile[0]) or !is_numeric($teile[1]) or abs($teile[0]) > 90 or abs($teile[1]) > 180) {
        error_log($lang[$i] . " - " . $matches[2][$m-2] . " = " . $teile[0] . " | " . $teile[1] . "\n", 3, "geodata.log");
      }
      else {
        fwrite($fp, '[' . number_format($teile[0],3) . ',' . number_format($teile[1],3) . ',"' . $matches[2][$m-2] . '",');
        // search for image
        $test = '<title>' . addcslashes($matches[2][$m-2], '()/') . '<.*?</page>';
        $pages = preg_match("@$test@is", $content, $page);
        if (!isset($page[0])) {
          $page[0] = substr($content, strpos($content, '<title>' . $matches[2][$m-2]), 1000);
        }       
        $pics = preg_match('/Image=([^"\[{\|]*?.jpg)/i', $page[0], $pic);
        if (isset($pic[0])) {
          $image = substr($pic[0],6);
          // md5 hash of image name
          $image = str_replace(' ', '_', trim($image));
          $md5 = md5($image);
          $md5path = substr($md5,0,1) . '/' . substr($md5,0,2) . '/';
          $image= $md5path . $image;
        }
        else {
          $image = '7/7e/WV-logo-artmap.jpg'; // default 
        }
        fwrite($fp, '"' . $image . '"' . "],\n");
      }
    }
  }
  fwrite($fp, "];\n");
  fclose($fp);
  copy("./data/" . $lang[$i] . "-articles.js","../w/data/" . $lang[$i] . "-articles.js");
}

error_log("\n==== " . date("Y-m-d - H:i:s") . " ====\n", 3, "geodata.log");

copy("geodata.log","../w/geodata.log");

echo '<span style="font-family:Courier New"</span>';
echo "<h2>GEODATA.LOG</h2>";
$errorfile = fopen("geodata.log","r");
while(!feof($errorfile)) {
  $line = fgets($errorfile);
  echo $line . "<br>";
  }
fclose($errorfile);

$delfile= fopen("articles.bz2", "w+");
fclose($delfile);

// echo '<pre>'; print_r($GLOBALS); echo '</pre>'; // *** TEST ***

?>
</body>
</html>