this script could be run from bash e.g. php biale_plamy.php --help
" ; check(); } } function check() { echo "
\n i run check()"; //todo to set arguments to rebuild tables etc: $check_tbls=array('Rozdzielcza_test_bzyk_drogi','Rozdzielcza_test_bzyk_joins','Rozdzielcza_test_bzyk_przylacza_HIST', 'Rozdzielcza_test_bzyk_przylacza','Rozdzielcza_test_bzyk_punkty_adresowe','Rozdzielcza_test_bzyk_ways'); //$tables = DB::getPDO()->list_tables(); foreach($check_tbls as $tbl) { $query = "select ID from ".$tbl." limit 1 "; echo "
\nresult chk for tbl:".$tbl." ;"; try{ $result = DB::getPDO()->fetchall($query); } catch(Exception $exception) { // return $exception; echo "
\n jest blad z tbl:".$tbl." i get sample table structure with data from ../sql/".$tbl.".sql - it should be manually replaced by correct/newer!"; $sql = file_get_contents('../sql/'.$tbl.'.sql'); try{ $result = DB::getPDO()->fetchall($sql); } catch(Exception $exception2) { echo "
\n jest blad dump dla tbl:".$tbl; } } // print_r($exception); print_r($result); } } init_sh_check(); $ways2joins = unserialize(file_get_contents('/tmp/save_ways2joins.txt')); $joins2ways = unserialize(file_get_contents('/tmp/save_joins2ways.txt')); $points2joins = unserialize(file_get_contents('/tmp/save_points2joins.txt')); $joins_asText = unserialize(file_get_contents('/tmp/save_joins_asText.txt')); $ways_asText = unserialize(file_get_contents('/tmp/save_ways_asText.txt')); $points_asText = unserialize(file_get_contents('/tmp/save_points_asText.txt')); $edge_joins=simplexml_load_file("edge_joins.xml"); $edge_joins->registerXPathNamespace('bp', 'https://procesy5.pl/biale_plamy-schema.xsd'); //print_r($edge_joins); foreach($edge_joins->children() as $child) { // echo "\n
"; //$attrs=$child->attributes("ID_Way"); foreach($child->attributes() as $a=>$b) { // echo "#87Child";print_r($b[0]); $ID_Way=$b[0]; } //echo $child->getName() . ": " . " ID_Way: ".$ID_Way. " : "; $id_j=0; settype($ID_Way, "integer"); //$ID_Way=var_dump($ID_Way); // echo "#88Child:"; print_r($ID_Way); //$edge_joins_path['ID_Way'][$attrs['ID_Way']]=array(); foreach($child->children('https://procesy5.pl/biale_plamy-schema.xsd') as $edge_joins_xml) { $id_j++; $attrs_join=$edge_joins_xml->attributes(); //echo " #93 ID_Join ".$attrs_join["Joins"]." "; $Join=$attrs_join["Joins"][0]; settype($Join, "integer"); $edge_joins_path[$ID_Way][$id_j]=$attrs_join["Joins"][0]; } } //print_r($edge_joins_path); function joins2lineString($joins_keys) { global $joins_asText; if ($joins_keys) { foreach ($joins_keys as $join_key) { $points[] = Vendor_Geophp::load($joins_asText[$join_key], 'wkt'); } return new LineString($points); } else return null; } function findWay($joinA, $joinB, $path = array()) { global $ways2joins, $joins2ways, $points2joins, $ways_asText, $points_asText; if ($joinA == $joinB) { $joinsPath = array($joinB); foreach (array_reverse($path) as $way_key) { array_unshift($joinsPath, $ways2joins[$way_key][1 - array_search($joinsPath[0], $ways2joins[$way_key])]); } return $joinsPath; } else { $subPaths = array(); foreach ($joins2ways[$joinA] as $way_key) { if (!in_array($way_key, $path)) { $new_join = $ways2joins[$way_key][1 - array_search($joinA, $ways2joins[$way_key])]; if ($subPath = findWay($new_join, $joinB, array_merge($path,array($way_key)))) $subPaths[] = $subPath; } } if ($subPaths) { if (count($subPaths) == 1) return $subPaths[0]; else { $shortestKey = 0; foreach ($subPaths as $key => $subPath) { $distance_cur = 0; foreach ($subPath as $way_key) { $way = Vendor_Geophp::load($ways_asText[$way_key], 'wkt'); if ($way) $distance_cur += Vendor_Geophp::load($ways_asText[$way_key], 'wkt')->length(); else $distance_cur += 999; } if (!$shortestKey || ($shortestKey && $distance_cur < $distance)) { $shortestKey = $key; $distance = $distance_cur; } } return $subPaths[$key]; } } else { return null; } } } function findJoinInDB($id) { global $joins_asText; $join = DB::getPDO()->fetchValue("select astext(the_geom) from Rozdzielcza_test_bzyk_joins where ID='{$id}'"); if ($join) { $join = Vendor_Geophp::load($join, 'wkt')->asText(); $key = array_search($join, $joins_asText); if ($key) return $key; else return null; } else return null; } function array_to_xml( $data, &$xml_data ) { foreach( $data as $key => $value ) { $key_=""; if( is_numeric($key) ){ $key_ = 'item'; } if( is_array($value) ) { $subnode = $xml_data->addChild($key_); $subnode->addAttribute('id', $key); array_to_xml($value, $subnode); } else { // $test_expl=explode(" ", $value); //preg_match('/[a-zA-Z]/', $value[0]) //if($key_=="" and !isset($test_expl[1]) ) $key_=htmlspecialchars("$value"); //czy nie jest jeden element array if($key_=="" and count($data[$key]==1)) { $subnode=$xml_data->addChild("$key",htmlspecialchars("$value")); } else $subnode=$xml_data->addChild("$key_",htmlspecialchars("$value")); if( is_numeric($key) ){ $subnode->addAttribute('id', $key); } } } } #echo joins2lineString($res = findWay(100,110))->asText(); #echo joins2lineString($res = findWay(25690,20134))->asText(); #$path = joins2lineString(findWay(25690,23039)); //$path = joins2lineString(findWay(findJoinInDB(49),findJoinInDB(50))); //generujemy path do $edge_joins_filled_paths DB::getPDO()->query("truncate table Rozdzielcza_test_bzyk_paths"); unset($ID_Way); $edge_joins_filled_paths=array(); foreach($edge_joins_path as $ID_Way=>$Joins_arr) { settype($ID_Way, "integer"); $edge_joins_filled_paths[$ID_Way]['tried']=1; if(isset($Joins_arr[1]) and isset($Joins_arr[2])) { $pkt_A=$Joins_arr[1];$pkt_B=$Joins_arr[2]; settype($pkt_A, "integer"); settype($pkt_B, "integer"); echo "\n
Generuje dla ID_Way:".$ID_Way." i joins ".$pkt_A." , ".$pkt_B." "; unset($res);unset($path); $res = findWay($pkt_A,$pkt_B); $path = joins2lineString($res)->asText(); // joins2lineString(findWay(389,404)); settype($path, "string"); $edge_joins_filled_paths[$ID_Way]['asText'] = $path; $distance = 0; foreach ($res as $way_key) { if(isset($ways_asText[$way_key])) $distance += Vendor_Geophp::load($ways_asText[$way_key], 'wkt')->greatCircleLength(); } $edge_joins_filled_paths[$ID_Way]['distance'] = $distance; //joins2lineString(findWay($Joins_arr[1],$Joins_arr[2])); //joins2lineString($res = findWay($joinAB['A'],$joinAB['B']))->asText(); $sql_insert_path="insert into Rozdzielcza_test_bzyk_paths (the_geom,ID_Way, A_RECORD_CREATE_DATE ) values (ST_GeomFromText('".$edge_joins_filled_paths[$ID_Way]['asText']."'),'".$ID_Way."' , now() ) "; echo "#216Query path ins:: ".$sql_insert_path." , distance:".$distance." "; if(strlen($edge_joins_filled_paths[$ID_Way]['asText'])>2) DB::getPDO()->query($sql_insert_path); else echo "#296 path nie wygenerowalo sie !! dla ".$ID_Way." i pkt ".$pkt_A." , ".$pkt_B." \n"; } else echo "\n#220 droga nie ma koncow ID_Way::".$ID_Way; } echo "
\n edge_joins_filled_paths:"; print_r($edge_joins_filled_paths); //save unset($xml_data); file_put_contents('edge_joins_filled_paths.txt',serialize($edge_joins_filled_paths)); ob_start();print_r($edge_joins_filled_paths); $contents = ob_get_contents();ob_end_clean(); file_put_contents('edge_joins_filled_paths_print_r.txt',$contents); $xml_data = new SimpleXMLElement(''); array_to_xml($edge_joins_filled_paths,$xml_data); print $xml_data->asXML("edge_joins_filled_paths.xml"); unset($xml_data); //test $timeStart = microtime(); $res = findWay(389,404); $path=joins2lineString($res)->asText(); $timeEnd = microtime(); if ($path) { echo $path."\n"; } else echo "Brak drogi"; list($usecStart, $secStart) = explode(" ", $timeStart); list($usecEnd, $secEnd) = explode(" ", $timeEnd); $diff = $secEnd - $secStart + $usecEnd - $usecStart; echo "\n\nCzas liczenia: ".$diff." s\n"; $distance = 0; foreach ($res as $way_key) { $distance += Vendor_Geophp::load($ways_asText[$way_key], 'wkt')->greatCircleLength(); } print_r($res); echo "Distance: ".$distance."m\n"; //eof test echo "\n
test2"; //test $timeStart = microtime(); $res = findWay(389,404); $path=joins2lineString($res)->asText(); $timeEnd = microtime(); if ($path) { echo $path."\n"; } else echo "Brak drogi"; list($usecStart, $secStart) = explode(" ", $timeStart); list($usecEnd, $secEnd) = explode(" ", $timeEnd); $diff = $secEnd - $secStart + $usecEnd - $usecStart; echo "\n\nCzas liczenia: ".$diff." s\n"; $distance = 0; foreach ($res as $way_key) { $distance += Vendor_Geophp::load($ways_asText[$way_key], 'wkt')->greatCircleLength(); } print_r($res); echo "Distance: ".$distance."m\n"; //eof test //$distance = 0; //foreach ($res as $way_key) { // $distance += Vendor_Geophp::load($ways_asText[$way_key], 'wkt')->greatCircleLength(); //} //print_r($res); //echo "Distance: ".$distance."m\n";