source: subversion/sites/www.openstreetbrowser.org/src/gen_mss_from_wiki.php @ 17282

Last change on this file since 17282 was 16408, checked in by skunk, 11 years ago

Files missing (please don't ask me why)

  • Property svn:executable set to *
File size: 10.1 KB
Line 
1#!/usr/bin/php
2<?
3require_once("conf.php");
4$columns=array(
5  "Categories"=>array("category", "bg-color", "fg-color"),
6  "Values"=>array("keys", "desc", "category", "network", "icon", "overlay"),
7  "Importance"=>array("key", "onlyicon", "icontext")
8);
9$scales_levels=array(
10  0,
11  500000000,
12  200000000, 
13  100000000,
14  50000000,
15  25000000,
16  12500000,
17  6500000,
18  3000000,
19  1500000,
20  750000,
21  400000,
22  200000,
23  100000,
24  50000,
25  25000,
26  12500,
27  5000,
28  2500,
29  1000);
30$img_list=array();
31
32function get_row($r, $f) {
33  $row=array();
34
35  if(substr($r, 0, 2)=="|-")
36    return null;
37  if(substr($r, 0, 2)=="|}")
38    return null;
39
40  do {
41    $cells=explode("||", $r);
42    if($cells[0]=="")
43      array_splice($cells, 0, 1);
44    elseif(ereg("^\|.*\|(.*)$", $r, $m))
45      $cells[0]=$m[1];
46
47    $row=array_merge($row, $cells);
48    $r=fgets($f);
49  } while(!in_array(substr($r, 0, 2), array("|-", "|}")));
50
51  return $row;
52}
53
54function read_wiki() {
55  global $wiki_stylesheet;
56  global $columns;
57  $data=array();
58
59  $f=fopen($wiki_stylesheet, "r");
60  unset($this_part);
61
62  while($r=fgets($f)) {
63    $r=chop($r);
64
65    if(ereg("==([^=]+)==", $r, $m)) {
66      $mode=0;
67      $part=trim($m[1]);
68    }
69
70    if(substr($r, 0, 1)=="|") {
71      $this_row=get_row($r, $f);
72
73      if($this_row&&($columns[$part])) { 
74        $src=array();
75        foreach($this_row as $i=>$r2) {
76          $src[$columns[$part][$i]]=trim($r2);
77        }
78     
79        $data[$part][]=$src;
80      }
81    }
82  }
83
84  fclose($f);
85  return $data;
86}
87
88function parse_key($key, $list_columns) {
89  $ret="";
90
91  if(eregi("\{\{Tag\|(.*)\|(.*)\}\}", $key, $m)) {
92    $ret="\"$m[1]\"='$m[2]'";
93    if($i==0)
94      $list_columns[$m[1]][]=$m[2];
95  }
96  elseif(eregi("\{\{Tag\|([^\}]*)\}\}", $key, $m)) {
97    $ret="\"$m[1]\" is not null";
98    if($i==0)
99      $list_columns[$m[1]][]="*";
100  }
101  else {
102    $l1=explode("=", $key);
103    if(sizeof($l1)==1)
104      return null;
105    if($l1[1]=="*") {
106      $ret="\"$l1[0]\" is not null";
107      if($i==0)
108        $list_columns[$l1[0]][]="*";
109    }
110    else {
111      $ret="\"$l1[0]\"='$l1[1]'";
112      if($i==0)
113        $list_columns[$l1[0]][]=$l1[1];
114    }
115  }
116
117  return $ret;
118}
119
120$wiki_data=read_wiki();
121
122$category_list=array();
123foreach($wiki_data["Categories"] as $src) {
124  $category_list[$src[category]]=$src;
125}
126
127foreach($wiki_data["Importance"] as $src) {
128  $scales[$src[key]]=$src;
129}
130
131foreach($overlays as $overlay=>$overlay_file) {
132  print "* $overlay\n";
133  $values_list=array();
134  foreach($wiki_data["Values"] as $src) {
135    if(eregi("$overlay\(([0-9]*)\)", $src[overlay], $m)) {
136      $keys_parts=explode(",", $src[keys]);
137      $keys=explode(" ", $keys_parts[0]);
138      $keys_imp=implode(" ", $keys);
139        $values_list[$m[1]][$keys_imp]=array("category"=>$src[category], "data"=>$src, "priority"=>$m[1], "alias"=>array_splice($keys_parts, 1, sizeof($keys_parts)));
140    }
141  }
142
143  $v=array();
144  for($i=0; $i<=max(array_keys($values_list)); $i++) {
145    if(sizeof($values_list[$i]))
146      $v=array_merge($v, $values_list[$i]);
147  }
148  $values_list=$v;
149//  print_r($values_list);
150
151  $index=0;
152  $sql_type="";
153  $sql_network="";
154  $sql_desc="";
155  $sql_where="";
156  $sql_order_network="";
157  $style_icon="";
158  $style_text="";
159  $list_columns=array();
160
161  foreach($values_list as $keys_imp=>$values_data) {
162    $data=$values_data[data];
163    $icon=$data[icon];
164
165    if(eregi("\[\[Image:(.*)\]\]", $icon, $m)) {
166      $icon=strtr($m[1], array(" "=>"_"));
167      if($img_list[$icon]) {
168        $icon="$symbol_path/$icon";
169      }
170      else {
171        $img_src=fopen("$wiki_img$icon", "r");
172        while($r=fgets($img_src)) {
173          if(eregi("<div class=\"fullImageLink\" .*<a href=\"([^\"]*)\">", $r, $m)) {
174            print $m[1]."\n";
175            $img=file_get_contents("$wiki_imgsrc$m[1]");
176            $img_d=fopen("$symbol_path/$icon", "w");
177            fwrite($img_d, $img);
178            fclose($img_d);
179
180            if(eregi("^(.*)\.svg$", $icon, $m)) {
181              system("convert -background none '$symbol_path/$icon' 'PNG:$symbol_path/$m[1].png'");
182              $icon="$m[1].png";
183            }
184
185            $img_list[$icon]=1;
186            $icon="$symbol_path/$icon";
187          }
188        }
189        fclose($img_src);
190      }
191    }
192    else
193      unset($icon);
194
195
196    if($icon)
197      $imgsize=getimagesize($icon);
198    else
199      $imgsize=array(0, -12);
200    if(!($category_data=$category_list[$data[category]])) {
201      $category_data=$category_list[substr($data[category], 0, strpos($data[category], "/"))];
202    }
203    foreach($scales as $network=>$zoom) {
204      if($icon) {
205        $style_icon.="  <Rule>\n";
206        $style_icon.="    <Filter>[type] = $index and [network] = '$network'</Filter>\n";
207        $style_icon.="    <MaxScaleDenominator>{$scales_levels[$zoom[onlyicon]]}</MaxScaleDenominator>\n";
208        $style_icon.="    <PointSymbolizer file = \"{$icon}\" type=\"png\" width=\"$imgsize[0]\" height=\"$imgsize[1]\" allow_overlap=\"true\"/>\n";
209        $style_icon.="  </Rule>\n";
210      }
211      $style_text.="  <Rule>\n";
212      $style_text.="    <Filter>[type] = $index and [network] = '$network'</Filter>\n";
213      $style_text.="    <MaxScaleDenominator>{$scales_levels[$zoom[onlyicon]]}</MaxScaleDenominator>\n";
214      $style_text.="    <TextSymbolizer dy=\"".ceil($imgsize[1]/2+6)."\" face_name=\"DejaVu Sans Book\" fill=\"#000000\" halo_fill=\"{$category_data["bg-color"]}\" halo_radius=\"1\" name=\"name\" placement=\"point\" size=\"10\"/>\n";
215      $style_text.="    <TextSymbolizer dy=\"".ceil($imgsize[1]/2+10+6)."\" face_name=\"DejaVu Sans Book\" fill=\"#000000\" halo_fill=\"{$category_data["bg-color"]}\" halo_radius=\"1\" name=\"desc\" placement=\"point\" size=\"8\"/>\n";
216      $style_text.="  </Rule>\n";
217    }
218
219    $sql_type.="  WHEN ";
220    $sql_network.="  WHEN ";
221
222    $keys=explode(" ", $keys_imp);
223    $l=array();
224    foreach($keys as $i=>$k) {
225      $l1=parse_key($k, &$list_columns);
226      if($l1) $l[]=$l1;
227    }
228
229    $alias=array();
230    foreach($values_data[alias] as $a) {
231      $a=explode(" ", $a);
232      $b=array();
233      foreach($a as $a1)
234        $l1=parse_key($a1, &$list_columns);
235        if($l1) $b[]=$l1;
236      $alias[]=implode(" and ", $b);
237    }
238
239    $statement=implode(" and ", $l);
240    if(sizeof($alias))
241      $statement="($statement) or (".implode(") or (", $alias).")";
242    $sql_type.=$statement;
243    $sql_network.=$statement;
244      $sql_desc.="  WHEN ";
245      $sql_desc.=$statement;
246    if($data[desc])
247      $sql_desc.=" THEN \"$data[desc]\"\n";
248    else
249      $sql_desc.=" THEN ''\n";
250  //  if($data[subkeys]) foreach($data[subkeys] as $subkey) {
251  //    $subkeys=explode(" ", $subkey);
252  ////    print $subkey;
253  //    $l=array();
254  //
255  //    foreach($subkeys as $k) {
256  //      $l1=explode("=", $k);
257  //      $l[]="[$l1[0]]='$l1[1]'";
258  //    }
259  //
260  //    print " and not (".implode(" and ", $l).")";
261  //
262  //  }
263    $sql_type.=" THEN $index\n";
264    $sql_network.=" THEN '{$data[network]}'\n";
265
266    $index++;
267  }
268
269  $sql_where=array();
270  foreach($list_columns as $key=>$values) {
271    if(in_array("*", $values))
272      $sql_where[]="\"$key\" is not null";
273    else
274      $sql_where[]="\"$key\" in ('".implode("', '", array_unique($values))."')";
275  }
276
277  $sql_where=implode(" or ", $sql_where);
278  $sql_order_network=<<<EOT
279    (CASE WHEN "network"='international' THEN 4
280          WHEN "network"='national' THEN 3
281          WHEN "network"='regional' THEN 2
282          WHEN "network"='urban' THEN 1
283          WHEN "network"='local' THEN 0 END)
284EOT;
285
286  $file=fopen("$style_path/$overlay_file.xml", "w");
287  fputs($file, "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
288  fputs($file, "<!DOCTYPE Map>\n");
289  fputs($file, "<Map srs=\"+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs +over\">\n");
290  fputs($file, "  <Style name=\"foobar\">\n");
291  fputs($file, $style_icon);
292  fputs($file, "  </Style>\n");
293  fputs($file, "  <Style name=\"foobar text\">\n");
294  fputs($file, $style_text);
295  fputs($file, "  </Style>\n");
296  fputs($file, "  <Layer name=\"foobar1\" srs=\"+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs +over\" status=\"on\">\n");
297  fputs($file, "  <StyleName>foobar</StyleName>\n");
298  fputs($file, "    <Datasource>\n");
299  fputs($file, "      <Parameter name=\"type\">postgis</Parameter>\n");
300  fputs($file, "      <Parameter name=\"dbname\">$db_name</Parameter>\n");
301  fputs($file, "      <Parameter name=\"table\">(select * from (select name, way, (CASE\n$sql_type\n  END) as type, (CASE\n  WHEN \"network\" is not NULL then \"network\"\n$sql_network\n  END) as network, (CASE\n  $sql_desc END) as desc from planet_osm_point where $sql_where union select name, way, (CASE\n$sql_type\n  END) as type, (CASE\n  WHEN \"network\" is not NULL then \"network\"\n$sql_network\n  END) as network, (CASE\n  $sql_desc END) as desc from planet_osm_polygon where $sql_where) as x1 order by $sql_order_network asc) as x2</Parameter>\n");
302  fputs($file, "      <Parameter name=\"estimate_extent\">false</Parameter>\n");
303  fputs($file, "      <Parameter name=\"extent\">-20037508,-19929239,20037508,19929239</Parameter>\n");
304  fputs($file, "    </Datasource>\n");
305  fputs($file, "  </Layer>\n");
306  fputs($file, "  <Layer name=\"foobar2\" srs=\"+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs +over\" status=\"on\">\n");
307  fputs($file, "  <StyleName>foobar text</StyleName>\n");
308  fputs($file, "    <Datasource>\n");
309  fputs($file, "      <Parameter name=\"type\">postgis</Parameter>\n");
310  fputs($file, "      <Parameter name=\"dbname\">$db_name</Parameter>\n");
311  fputs($file, "      <Parameter name=\"table\">(select * from (select name, way, (CASE\n$sql_type\n  END) as type, (CASE\n  WHEN \"network\" is not NULL then \"network\"\n$sql_network\n  END) as network, (CASE\n  $sql_desc END) as desc from planet_osm_point where $sql_where union select name, way, (CASE\n$sql_type\n  END) as type, (CASE\n  WHEN \"network\" is not NULL then \"network\"\n$sql_network\n  END) as network, (CASE\n  $sql_desc END) as desc from planet_osm_polygon where $sql_where) as x1 order by $sql_order_network desc) as x2</Parameter>\n");
312  fputs($file, "      <Parameter name=\"estimate_extent\">false</Parameter>\n");
313  fputs($file, "      <Parameter name=\"extent\">-20037508,-19929239,20037508,19929239</Parameter>\n");
314  fputs($file, "    </Datasource>\n");
315  fputs($file, "  </Layer>\n");
316  fputs($file, "</Map>\n");
317}
Note: See TracBrowser for help on using the repository browser.