0.5){$len=(1-$ll)*$len;} if($len>0.2){ echo "-- Teile Weg $gid bei $ll am Punkt $p1 $p2\n"; pg_query($db, "BEGIN WORK"); $query="select max(source) as m from routing_ways;"; $result=pg_query($db,$query); $e=pg_fetch_array($result); $po=$e['m']; $query="select max(target) as m from routing_ways;"; $result=pg_query($db,$query); $e=pg_fetch_array($result); if($e['m']>$po){$po=$e['m'];} $po++; $query="select max(gid) as m from routing_ways;"; $result=pg_query($db,$query); $e=pg_fetch_array($result); $gi=$e['m']+1; $query="select gid,class_id,osm_id,source,target,the_geom,length,costfactor,hdiff from routing_ways where gid=$gid;"; $result=pg_query($db,$query); $e=pg_fetch_array($result); $gid=$e['gid']; $q="insert into routing_ways (gid,class_id,osm_id,source,target,the_geom,length,hdiff,costfactor) values ($gi,".$e['class_id'].",".$e['osm_id'].",".$e['source'].",".$e['target'].",(select the_geom from routing_ways where gid=$gid),".$e['length'].",".$e['hdiff'].",".$e['costfactor'].");"; $r=pg_query($db,$q); $q="update routing_ways set target=$po where gid=$gid;"; $r=pg_query($db,$q); $q="update routing_ways set source=$po where gid=$gi;"; $r=pg_query($db,$q); $q="update routing_ways set hdiff=hdiff*$ll where gid=$gid;"; $r=pg_query($db,$q); $q="update routing_ways set hdiff=hdiff*(1-$ll) where gid=$gi;"; $r=pg_query($db,$q); $q="update routing_ways set the_geom=st_line_substring(the_geom,$ll,1) where gid=$gi;"; $r=pg_query($db,$q); $q="update routing_ways set the_geom=st_line_substring(the_geom,0,$ll) where gid=$gid;"; $r=pg_query($db,$q); $q="update routing_ways set length=st_length(st_transform(the_geom,900913))*0.66 where gid=$gid;"; $r=pg_query($db,$q); $q="update routing_ways set length=st_length(st_transform(the_geom,900913))*0.66 where gid=$gi;"; $r=pg_query($db,$q); $q="update routing_ways set x1=st_x(st_startpoint(the_geom)) where gid=$gi;"; $r=pg_query($db,$q); $q="update routing_ways set y1=st_y(st_startpoint(the_geom)) where gid=$gi;"; $r=pg_query($db,$q); $q="update routing_ways set x2=st_x(st_endpoint(the_geom)) where gid=$gi;"; $r=pg_query($db,$q); $q="update routing_ways set y2=st_y(st_endpoint(the_geom)) where gid=$gi;"; $r=pg_query($db,$q); $q="update routing_ways set x1=st_x(st_startpoint(the_geom)) where gid=$gid;"; $r=pg_query($db,$q); $q="update routing_ways set y1=st_y(st_startpoint(the_geom)) where gid=$gid;"; $r=pg_query($db,$q); $q="update routing_ways set x2=st_x(st_endpoint(the_geom)) where gid=$gid;"; $r=pg_query($db,$q); $q="update routing_ways set y2=st_y(st_endpoint(the_geom)) where gid=$gid;"; $r=pg_query($db,$q); pg_query($db, "COMMIT"); $ret=$gi; } return $ret; } function verbinde($db,$gid,$source,$target,$way,$osm_id,$start,$ende){ // // Fuegt den Streckenanteil start bis ende des Weges way mit der gid in den Graphen ein // echo "-- Verbinde $source mit $target\n"; $q="insert into routing_ways (gid,class_id,osm_id,source,target,waysource,costfactor,hdiff) values ($gid,0,$osm_id,$source,$target,'relation',1.0,0);"; $r=pg_query($db,$q); $q="update routing_ways set the_geom=ST_GeomFromText('$way',4326) where gid=$gid;"; $r=pg_query($db,$q); $q="update routing_ways set the_geom=st_line_substring(the_geom,$start,$ende) where gid=$gid;"; $r=pg_query($db,$q); $q="update routing_ways set length=st_length(st_transform(the_geom,900913))*0.66 where gid=$gid;"; $r=pg_query($db,$q); $q="update routing_ways set x1=st_x(st_startpoint(the_geom)) where gid=$gid;"; $r=pg_query($db,$q); $q="update routing_ways set y1=st_y(st_startpoint(the_geom)) where gid=$gid;"; $r=pg_query($db,$q); $q="update routing_ways set x2=st_x(st_endpoint(the_geom)) where gid=$gid;"; $r=pg_query($db,$q); $q="update routing_ways set y2=st_y(st_endpoint(the_geom)) where gid=$gid;"; $r=pg_query($db,$q); } function aufbrech($db,$id,$way,$npoints){ // // Alle kreuzenden Wege finden und ggf an der Kreuzung auftrennen // das muss man ggf mehrmal machen, falls ein Weg oefter kreuzt (rein // und raus oder z.B. parallel zum Polygon...) // Manchmal aber auch nicht, falls der "Kreuzungspunkt" der Endpunkt // ist, das stellt aber dann erst teilweg() fest. // $n=0;$fertig=0; while(!$fertig){ $n++; $fertig=1; echo "-- Aufbrech ($n. Durchgang): $id mit $npoints Punkten\n"; $query1="SELECT gid,osm_id,st_astext(ST_Intersection(the_geom,ST_GeomFromText('$way',4326))) as intersec FROM routing_ways WHERE st_intersects(the_geom,ST_GeomFromText('$way',4326));"; $result1=pg_query($db,$query1); while ($querung=pg_fetch_array($result1)){ $query2="select layer from osm_line where osm_id='".$querung['osm_id']."' limit 1;"; $result2=pg_query($db,$query2); $e=pg_fetch_array($result2); if($e && $e['layer']+0==0){ echo "-- Schnittpunkt mit gid=".$querung['gid']." (osm_id=".$querung['osm_id'].") Bei ".$querung['intersec']."\n"; echo "-- ".$querung['intersec']."\n"; if(strpos($querung['intersec'],'MULTIPOINT')===FALSE){ $its=str_ireplace(array('POINT','(',')'),'',$querung['intersec']); $its=split(' ',$its); teilweg($db,$querung['gid'],$its[0],$its[1]); $fertig=1; }else{ $its=str_ireplace(array('MULTIPOINT','(',')'),'',$querung['intersec']); $its=str_ireplace(',',' ',$its); $its=split(' ',$its); $t=teilweg($db,$querung['gid'],$its[0],$its[1]); if($t){$fertig=0;} } } } } } function anflansch($db,$id,$way,$osm_id){ // // Setzt den Way mit der id in den Graphen ein. // echo "-- Anflansch: $id \n"; // // Alle "kreuzenden" Start- und Enpunkte rauskriegen und sortiert ausgeben // $query1="(SELECT gid,osm_id,'E' as point,target as node,st_astext(st_endpoint(the_geom)) as intersec,ST_Line_Locate_Point(ST_GeomFromText('$way',4326),st_endpoint(the_geom)) as distance FROM routing_ways WHERE the_geom && ST_GeomFromText('$way',4326) and st_distance(st_endpoint(the_geom),ST_GeomFromText('$way',4326))<0.000003) union (SELECT gid,osm_id,'S' as point,source as node,st_astext(st_startpoint(the_geom)) as intersec,ST_Line_Locate_Point(ST_GeomFromText('$way',4326),st_startpoint(the_geom)) as distance FROM routing_ways WHERE the_geom && ST_GeomFromText('$way',4326) and st_distance(st_startpoint(the_geom),ST_GeomFromText('$way',4326))<0.000003) order by distance;"; $result1=pg_query($db,$query1); $alterpunkt=0;$altestrecke=0; $query2="select max(gid) as m from routing_ways;"; $result2=pg_query($db,$query2); $e=pg_fetch_array($result2); $gi=$e['m'];$i=0; $query="select max(source) as m from routing_ways;"; $result=pg_query($db,$query); $e=pg_fetch_array($result); $po=$e['m']; $query="select max(target) as m from routing_ways;"; $result=pg_query($db,$query); $e=pg_fetch_array($result); if($e['m']>$po){$po=$e['m'];} $po++; $startsource=$alterpunkt=$po; // // Alle Punkte durchgehen und en Weg vom n-ten bis zum n+1-ten Weg einsetzen // Die Start- und Enpunkte sind bereits als Knoten im Graphen, nur der erste // und letzte fehlt evtl. // $fertig=0; while ((!$fertig)&&($querung=pg_fetch_array($result1))){ echo "-- Schnittpunkt mit gid=".$querung['gid']." (osm_id=".$querung['osm_id'].") Beim ".$querung['point']."-Punkt ".$querung['node']." ".$querung['intersec']." bei ".$querung['distance']."\n"; if($alterpunkt!=$querung['node']){ $i++; if($i==1){ if($querung['distance']<0.005){ $querung['distance']=0; $startsource=$querung['node']; echo "-- Erster Weg ist schon da \n"; }else{ $query="select max(source) as m from routing_ways;"; $result=pg_query($db,$query); $e=pg_fetch_array($result); $po=$e['m']; $query="select max(target) as m from routing_ways;"; $result=pg_query($db,$query); $e=pg_fetch_array($result); if($e['m']>$po){$po=$e['m'];} $po++; $alterpunkt=$po;$altestrecke=0; echo "-- Baue ersten Weg Nr $gi von $alterpunkt zu ".$querung['node']." (von $altestrecke bis ".$querung['distance'].")\n"; $gi++; verbinde($db,$gi,$alterpunkt,$querung['node'],$way,$osm_id,$altestrecke,$querung['distance']); $startsource=$po; } } if($querung['distance']>0.995){ $querung['distance']=1; $querung['node']=$startsource; $fertig=1; } $gi++; echo "-- Baue Weg Nr $gi von $alterpunkt zu ".$querung['node']." (von $altestrecke bis ".$querung['distance'].")\n"; verbinde($db,$gi,$alterpunkt,$querung['node'],$way,$osm_id,$altestrecke,$querung['distance']); } $alterpunkt=$querung['node']; $altestrecke=$querung['distance']; } if(!$fertig){ $gi++; $querung['distance']=1; $querung['node']=$startsource; echo "-- Baue Letzten Weg Nr $gi von $alterpunkt zu ".$startsource." (von $altestrecke bis ".$querung['distance'].")\n"; verbinde($db,$gi,$alterpunkt,$querung['node'],$way,$osm_id,$altestrecke,$querung['distance']); } } set_time_limit(900); // // Alle Polygone holen, die in Frage kommen, der einfachheit halber auch gleich den aeusseren Ring davon // $query1="delete from routing_ways where waysource='relation';"; $result1=pg_query($dbosm,$query1); $query1="SELECT osm_id,ST_NRings(way) as nr,ST_astext(st_transform(ST_ExteriorRing(way),4326)) as extway, ST_NPoints(way) as npoints FROM osm_polygon WHERE osm_id <0 and (highway in ('pathless','pedestrian','track','path','service','residential') or (nature='beach') or (tags->'public_transport'='platform') ) and (access is null or access='yes' or access='designated' or foot='yes') and (foot is null or foot !='no') and (layer is null or layer='0') and GeometryType(way)='POLYGON';"; $result1=pg_query($dbosm,$query1); while($polygon=pg_fetch_array($result1)){ $einbau=1; echo "-- ".$polygon['osm_id']." hat ".$polygon['nr']." Ringe \n"; $relation=-1*$polygon['osm_id']; // // Erstmal die passende Relation suchen und dann deren outer suchen und nachsehen, ob die // vielleicht schon eingebaut wurden. osm2pgsql macht ja intelligente ersetzungen an den // Relationen und zieht z.B. highway-Tags eines outer in den Umring. osm2po macht das // nicht und so koennte es sein, dass wir hier was als Ring sehen, wo osm2po schon ein // Teil davon eingebaut hat. Falls mindestens einer der outer eingebaut ist, wird der // Umring ignoriert. // $query2="SELECT members from osm_rels where id=".$relation.";"; $result2=pg_query($dbosm,$query2); while($m=pg_fetch_array($result2)){ $mb=str_ireplace(array('{','}'),'',$m['members']); $mb=str_ireplace(array(','),' ',$mb); $mbe=split(' ',$mb); echo "-- Members: ".$mb."\n"; $outercounter=0; for($i=1;$i<=count($mbe);$i+=2){ $mbe[$i-1]=substr($mbe[$i-1],1); if($mbe[$i]=='outer'){ $outercounter++; $query3="select gid from routing_ways where osm_id=".$mbe[$i-1].";"; $result3=pg_query($dbosm,$query3); if(pg_fetch_array($result3)){ echo "-- Aber ein outer (".$mbe[$i-1].") existiert schon in den Routing-ways\n"; $einbau=0; } } } if($outercounter==0){ echo "-- Aber das merkwuerdige Ding hat keinen outer way...\n"; $einbau=0; } } // // Falls es sein muss... // erstmal den aeusseren Ring einbauen... // if($einbau){ // // Den vorhandenen Graphen an den Anschlusstellen aufbrechen... // aufbrech($dbosm,$polygon['osm_id'],$polygon['extway'],$polygon['npoints']); // // Und dann den Ring dort einbauen // anflansch($dbosm,$polygon['osm_id'],$polygon['extway'],-1*$polygon['osm_id']); // // die internen Ringe dann auch gleich... // for($i=1;$i<=$polygon['nr'];$i++){ echo "-- Inner: ".$i."\n"; $query2="SELECT ST_astext(st_transform(ST_InteriorRingN(way,$i),4326)) as intway FROM osm_polygon WHERE osm_id=".$polygon['osm_id'].";"; $result2=pg_query($dbosm,$query2); $inner=pg_fetch_array($result2); aufbrech($dbosm,$polygon['osm_id'],$inner['intway'],0); anflansch($dbosm,$polygon['osm_id'],$inner['intway'],-1*$polygon['osm_id']); } } } pg_close($dbosm); exit; ?>