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; } } }
/** * 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; }
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(); }