コード例 #1
0
ファイル: functions.php プロジェクト: plepe/OpenStreetBrowser
function array_deep_copy(&$array, &$copy, $maxdepth = 50, $depth = 0)
{
    if ($depth > $maxdepth) {
        $copy = $array;
        return;
    }
    if (!is_array($copy)) {
        $copy = array();
    }
    foreach ($array as $k => &$v) {
        if (is_array($v)) {
            array_deep_copy($v, $copy[$k], $maxdepth, ++$depth);
        } else {
            $copy[$k] = $v;
        }
    }
}
コード例 #2
0
 /**
  * Array deep copy
  *
  * @params  array  $array
  * @params  int    $maxdepth
  * @params  int    $depth
  *
  * @return  array  copy of the array
  *
  * @static
  * @access public
  */
 static function array_deep_copy(&$array, $maxdepth = 50, $depth = 0)
 {
     if ($depth > $maxdepth) {
         return $array;
     }
     $copy = array();
     foreach ($array as $key => $value) {
         if (is_array($value)) {
             array_deep_copy($value, $copy[$key], $maxdepth, ++$depth);
         } else {
             $copy[$key] = $value;
         }
     }
     return $copy;
 }
コード例 #3
0
function build_mapnik_style($id, $data, $global_tags) {
  global $importance_levels;
  global $postgis_tables;

  $layers=array("polygon_shape"=>array("reverse"),
		"line_shape" =>array("reverse"),
 		"point_icon"=>array("reverse"),
		"point_text"=>array("normal"),
		"line_text" =>array("normal"),
                "line_icon"=>array("normal"));

  $dom=new DOMDocument();
  $map=$dom->createElement("Map");
  $map->setAttribute("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");
  $dom->appendChild($map);

  categories_insert_fontsets($map, $dom);

  $ret=array();
  $columns=array();
  foreach($data as $importance=>$data1) if($importance!="_") {
    foreach($data1 as $table=>$data2) {
      $style_icon=$dom->createElement("Style");
      $style_icon->setAttribute("name", "{$id}_{$importance}_{$table}_icon");
      $style_text=$dom->createElement("Style");
      $style_text->setAttribute("name", "{$id}_{$importance}_{$table}_text");
      $style_shape=$dom->createElement("Style");
      $style_shape->setAttribute("name", "{$id}_{$importance}_{$table}_shape");
      foreach($data2['rule'] as $i=>$tags) {
	$rule_id=$data2['rule_id'][$i];

	// layer polygon_shape
	if(isset($postgis_tables[$table])&&
	   in_array("polygon_shape", $postgis_tables[$table]['layers'])) {
	  $def=mapnik_style_polygon_polygon($dom, $rule_id, $tags, $global_tags, $importance);
	  if(isset($def)) {
	    $style_shape->appendChild($def['rule']);
	    $columns[]=$def['columns'];
	  }
	}

	// layer point_icon
	if(isset($postgis_tables[$table])&&
	   in_array("point_icon", $postgis_tables[$table]['layers'])) {
	  $def=mapnik_style_point_icon($dom, $rule_id, $tags, $global_tags, $importance);
	  if(isset($def)) {
	    $style_icon->appendChild($def['rule']);
	    $columns[]=$def['columns'];
	  }
	}

	// layer point_text
	if(isset($postgis_tables[$table])&&
	   in_array("point_text", $postgis_tables[$table]['layers'])) {
	  $def=mapnik_style_point_text($dom, $rule_id, $tags, $global_tags, $importance);
	  if(isset($def)) {
	    $style_text->appendChild($def['rule']);
	    $columns[]=$def['columns'];
	  }
	}

	// layer line_shape
	if(isset($postgis_tables[$table])&&
	   in_array("line_shape", $postgis_tables[$table]['layers'])) {
	  $def=mapnik_style_line_line($dom, $rule_id, $tags, $global_tags, $importance);
	  if(isset($def)) {
	    $style_shape->appendChild($def['rule']);
	    $columns[]=$def['columns'];
	  }
	}

	// layer line_text
	if(isset($postgis_tables[$table])&&
	   in_array("line_text", $postgis_tables[$table]['layers'])) {
	  $def=mapnik_style_line_text($dom, $rule_id, $tags, $global_tags, $importance);
	  if(isset($def)) {
	    $style_text->appendChild($def['rule']);
	    $columns[]=$def['columns'];
	  }
	}

	// layer line_icon
	if(isset($postgis_tables[$table])&&
	   in_array("line_shape", $postgis_tables[$table]['layers'])) {
	  $def=mapnik_style_line_icon($dom, $rule_id, $tags, $global_tags, $importance);
	  if(isset($def)) {
	    $style_icon->appendChild($def['rule']);
	    $columns[]=$def['columns'];
	  }
	}
      }

      print "Columns (1): ";
      print_r($columns);
      $new_columns=array();
      foreach($columns as $col) {
	if(!isset($col));
	else if(is_string($col)) {
	  $new_columns[]=$col;
	}
	else if(is_array($col)) {
	  foreach($col as $col1) {
	    $new_columns[]=$col1;
	  }
	}
      }
      $columns=array_unique($new_columns);

      print "Columns (2): ";
      print_r($columns);

      $sql_tables=$data2['sql'];
      $sql_select=array();
      $sql_join=array();
      $sql_select[]="t.*";

      foreach($columns as $col) {
	$el=explode("|", $col);
	$str="osb_$el[0](t.osm_id, t.osm_tags, t.geo, t.rule_tags";
	for($i=1; $i<sizeof($el); $i++)
	  $str.=", ".postgre_escape($el[$i]);
	$str.=") as \"$el[1]\"";
	$sql_select[]=$str;
      }

      $sql_select="\n  ".implode(",\n  ", $sql_select);
      $sql_join="\n  ".implode("\n  ", $sql_join);

      $sql ="";
      $sql.="/* {$id}.mapnik: s!scale_denominator!, {$importance} */ ";
      $sql.="(select{$sql_select} from ($sql_tables) as t{$sql_join}) as u";

      if(in_array($table, array("polygon"))) {
	$layer=mapnik_get_layer($dom, "{$id}_{$importance}_{$table}_shape", $sql, "polygon");
	$map_layers['polygon_shape'][$importance][]=$style_shape;
	$map_layers['polygon_shape'][$importance][]=$layer;
      }
      if(in_array($table, array("point", "polygon", "point_extract"))) {
	$layer=mapnik_get_layer($dom, "{$id}_{$importance}_{$table}_icon", $sql, "point");
	$map_layers['point_icon'][$importance][]=$style_icon;
	$map_layers['point_icon'][$importance][]=$layer;

	$layer=mapnik_get_layer($dom, "{$id}_{$importance}_{$table}_text", $sql, "point");
	$map_layers['point_text'][$importance][]=$style_text;
	$map_layers['point_text'][$importance][]=$layer;
      }
      else {
	$layer=mapnik_get_layer($dom, "{$id}_{$importance}_{$table}_shape", $sql, "line");
	$map_layers['line_shape'][$importance][]=$style_shape;
	$map_layers['line_shape'][$importance][]=$layer;

	$layer=mapnik_get_layer($dom, "{$id}_{$importance}_{$table}_text", $sql, "line");
	$map_layers['line_text'][$importance][]=$style_text;
	$map_layers['line_text'][$importance][]=$layer;

	$layer=mapnik_get_layer($dom, "{$id}_{$importance}_{$table}_icon", $sql, "line");
	$map_layers['line_icon'][$importance][]=$style_icon;
	$map_layers['line_icon'][$importance][]=$layer;
      }

    }
  }

  foreach($layers as $layer=>$layer_desc) {
    array_deep_copy($importance_levels, $importance_list);
    if($layer_desc[0]=="reverse")
      $importance_list=array_reverse($importance_list);

    for($i=0; $i<sizeof($importance_list); $i++) {
      if(isset($map_layers[$layer]))
	if(isset($map_layers[$layer][$importance_list[$i]]))
	  foreach($map_layers[$layer][$importance_list[$i]] as $el)
	    $map->appendChild($el);
    }
  }

  return $dom->saveXML();
}