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

Last change on this file since 29773 was 20010, checked in by skunk, 10 years ago

Bugfix: New Mapnik draws labels on top, middle or bottom of point. Always use middle.

  • Property svn:executable set to *
File size: 8.8 KB
Line 
1#!/usr/bin/php
2<?
3require_once("conf.php");
4require_once("src/wiki_stuff.php");
5
6$columns=array(
7  "Categories"=>array("category", "bg-color", "fg-color"),
8  "Values"=>array("keys", "desc", "category", "network", "icon", "overlay"),
9  "Importance"=>array("key", "onlyicon", "icontext")
10);
11$scales_levels=array(
12  0,
13  500000000,
14  200000000, 
15  100000000,
16  50000000,
17  25000000,
18  12500000,
19  6500000,
20  3000000,
21  1500000,
22  750000,
23  400000,
24  200000,
25  100000,
26  50000,
27  25000,
28  12500,
29  5000,
30  2500,
31  1000);
32$img_list=array();
33
34$wiki_data=read_wiki();
35
36$category_list=array();
37foreach($wiki_data["Categories"] as $src) {
38  $category_list[$src[category]]=$src;
39}
40
41foreach($wiki_data["Importance"] as $src) {
42  $scales[$src[key]]=$src;
43}
44
45$process_overlays=array();
46// Download symbols
47$img_list=array();
48$process_overlays=array();
49// Download symbols
50$img_list=array();
51foreach($wiki_data["Values"] as $src) {
52  if(ereg("^([a-z:_]*)\(", $src[overlay], $m))
53    $process_overlays[$m[1]]=1;
54
55  if(eregi("\[\[Image:(.*)\]\]", $src[icon], $m)) {
56    $icon=strtr($m[1], array(" "=>"_"));
57    if(!$img_list[$icon]) {
58      $img_data=gzfile("$wiki_img$icon");
59
60      if(!$img_data)
61        print "Can't open $wiki_img$icon\n";
62
63      unset($icon_path);
64      foreach($img_data as $r) {
65        if(eregi("<div class=\"fullImageLink\" .*<a href=\"([^\"]*)\">", $r, $m)) {
66          print $m[1]."\n";
67          $img=file_get_contents("$wiki_imgsrc$m[1]");
68          if(!$img)
69            print "Can't download $wiki_imgsrc$m[1]\n";
70          $img_d=fopen("$symbol_path/$icon", "w");
71          fwrite($img_d, $img);
72          fclose($img_d);
73
74          $icon_path="$symbol_path/$icon";
75
76          if(eregi("^(.*)\.svg$", $icon, $m)) {
77            system("convert -background none '$symbol_path/$icon' 'PNG:$symbol_path/$m[1].png'");
78            $icon_path="$symbol_path/$m[1].png";
79          }
80
81          $img_list[$icon]=$icon_path;
82        }
83      }
84
85      if(!$icon_path) {
86        print "not found!\n";
87        exit;
88      }
89    }
90  }
91}
92$process_overlays=array_keys($process_overlays);
93
94foreach($process_overlays as $overlay) {
95  print "* $overlay\n";
96  $values_list=array();
97  foreach($wiki_data["Values"] as $src) {
98    if(eregi("$overlay\(([0-9]*)\)", $src[overlay], $m)) {
99      $values_list[$m[1]][]=array("category"=>$src[category], "data"=>$src, "priority"=>$m[1]);
100    }
101  }
102
103  $v=array();
104  for($i=0; $i<=max(array_keys($values_list)); $i++) {
105    if(sizeof($values_list[$i]))
106      $v=array_merge($v, $values_list[$i]);
107  }
108  $values_list=$v;
109 //print_r($values_list);
110
111  $index=0;
112  $sql_type="";
113  $sql_network="";
114  $sql_desc="";
115  $sql_where="";
116  $sql_order_network="";
117  $style_icon="";
118  $style_text="";
119  $list_columns=array();
120
121  foreach($values_list as $values_data) {
122    $data=$values_data[data];
123    $icon=$data[icon];
124    $icon_prefix=false;
125
126    if(eregi("\[\[Image:(.*)\]\]", $icon, $m)) {
127      $icon=strtr($m[1], array(" "=>"_"));
128      if($img_list[$icon]) {
129        $icon=$img_list[$icon];
130      }
131      else
132        unset($icon);
133    }
134    else
135      unset($icon);
136
137    if($icon)
138      $imgsize=getimagesize($icon);
139    else
140      $imgsize=array(0, -12);
141    if(!($category_data=$category_list[$data[category]])) {
142      $category_data=$category_list[substr($data[category], 0, strpos($data[category], "/"))];
143    }
144    foreach($scales as $network=>$zoom) {
145      if($icon) {
146        $style_icon.="  <Rule>\n";
147        $style_icon.="    <Filter>[type] = $index and [network] = '$network'</Filter>\n";
148        $style_icon.="    <MaxScaleDenominator>{$scales_levels[$zoom[onlyicon]]}</MaxScaleDenominator>\n";
149        $style_icon.="    <PointSymbolizer file = \"{$icon}\" type=\"png\" width=\"$imgsize[0]\" height=\"$imgsize[1]\" allow_overlap=\"true\"/>\n";
150        $style_icon.="  </Rule>\n";
151      }
152      $style_text.="  <Rule>\n";
153      $style_text.="    <Filter>[type] = $index and [network] = '$network'</Filter>\n";
154      $style_text.="    <MaxScaleDenominator>{$scales_levels[$zoom[onlyicon]]}</MaxScaleDenominator>\n";
155      $style_text.="    <TextSymbolizer dy=\"".ceil($imgsize[1]/2+3)."\" vertical_alignment=\"middle\" face_name=\"DejaVu Sans Book\" fill=\"#000000\" name=\"name\" placement=\"point\" size=\"10\"";
156      if($category_data["bg-color"])
157        $style_text.=" halo_fill=\"{$category_data["bg-color"]}\" halo_radius=\"1\"";
158      $style_text.="/>\n";
159      $style_text.="    <TextSymbolizer dy=\"".ceil($imgsize[1]/2+10+3)."\" vertical_alignment=\"middle\" face_name=\"DejaVu Sans Book\" fill=\"#000000\" name=\"desc\" placement=\"point\" size=\"8\"";
160      if($category_data["bg-color"])
161        $style_text.=" halo_fill=\"{$category_data["bg-color"]}\" halo_radius=\"1\"";
162      $style_text.="/>\n";
163      $style_text.="  </Rule>\n";
164    }
165
166    $sql_type.="  WHEN ";
167    $sql_network.="  WHEN ";
168
169    $statement=parse_wholekey($data[keys], &$list_columns);
170    $sql_type.=$statement;
171    $sql_network.=$statement;
172      $sql_desc.="  WHEN ";
173      $sql_desc.=$statement;
174    if($data[desc])
175      $sql_desc.=" THEN \"$data[desc]\"\n";
176    else
177      $sql_desc.=" THEN ''\n";
178    $sql_type.=" THEN $index\n";
179    $sql_network.=" THEN '{$data[network]}'\n";
180
181    $index++;
182  }
183
184  $sql_where=array();
185  foreach($list_columns as $key=>$values) {
186    // if all values are "positive" (no 'not null' and no 'not in (...)')
187    // then we can make use of indices
188    $pos=true;
189    foreach($values as $v) {
190      if((substr($v, 0, 1)=="!")||($v=="*")) {
191        $pos=false;
192      }
193    }
194
195    if($pos)
196      $sql_where[]="\"$key\" in ('".implode("', '", array_unique($values))."')";
197  }
198
199  $sql_where=implode(" or ", $sql_where);
200  $sql_order_network=<<<EOT
201    (CASE WHEN "network"='international' THEN 4
202          WHEN "network"='national' THEN 3
203          WHEN "network"='regional' THEN 2
204          WHEN "network"='urban' THEN 1
205          WHEN "network"='local' THEN 0 END)
206EOT;
207
208  // XML doesn't like < and >
209  $sql_desc=strtr($sql_desc, array("<"=>"&lt;", ">"=>"&gt;"));
210  $sql_type=strtr($sql_type, array("<"=>"&lt;", ">"=>"&gt;"));
211  $sql_network=strtr($sql_network, array("<"=>"&lt;", ">"=>"&gt;"));
212
213  $file=fopen("$style_path/$overlay.layer", "w");
214  fputs($file, "  <Style name=\"foobar\">\n");
215  fputs($file, $style_icon);
216  fputs($file, "  </Style>\n");
217  fputs($file, "  <Style name=\"foobar text\">\n");
218  fputs($file, $style_text);
219  fputs($file, "  </Style>\n");
220  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");
221  fputs($file, "  <StyleName>foobar</StyleName>\n");
222  fputs($file, "    <Datasource>\n");
223  fputs($file, "      <Parameter name=\"type\">postgis</Parameter>\n");
224  fputs($file, "      <Parameter name=\"dbname\">$db_name</Parameter>\n");
225  fputs($file, "      <Parameter name=\"table\">(select * from (select name, way, (CASE\n$sql_type\n  END) as type, (CASE\n  WHEN \"network\" in ('international', 'national', 'regional', 'urban', 'suburban', 'local') 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\"  in ('international', 'national', 'regional', 'urban', 'suburban', 'local') 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");
226  fputs($file, "      <Parameter name=\"estimate_extent\">false</Parameter>\n");
227  fputs($file, "      <Parameter name=\"extent\">-20037508,-19929239,20037508,19929239</Parameter>\n");
228  fputs($file, "    </Datasource>\n");
229  fputs($file, "  </Layer>\n");
230  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");
231  fputs($file, "  <StyleName>foobar text</StyleName>\n");
232  fputs($file, "    <Datasource>\n");
233  fputs($file, "      <Parameter name=\"type\">postgis</Parameter>\n");
234  fputs($file, "      <Parameter name=\"dbname\">$db_name</Parameter>\n");
235  fputs($file, "      <Parameter name=\"table\">(select * from (select name, way, (CASE\n$sql_type\n  END) as type, (CASE\n  WHEN \"network\" in ('international', 'national', 'regional', 'urban', 'suburban', 'local') 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\" in ('international', 'national', 'regional', 'urban', 'suburban', 'local') 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");
236  fputs($file, "      <Parameter name=\"estimate_extent\">false</Parameter>\n");
237  fputs($file, "      <Parameter name=\"extent\">-20037508,-19929239,20037508,19929239</Parameter>\n");
238  fputs($file, "    </Datasource>\n");
239  fputs($file, "  </Layer>\n");
240}
Note: See TracBrowser for help on using the repository browser.