=0.995)$ret=$r['target']; if(($ll>0.005)&&($ll<0.995)&&($stueckel==0)){$ret=-1;} if(($ll>0.005)&&($ll<0.995)&&($stueckel==1)){ // echo "-- Teile Weg $gid bei $ll am Punkt $p1 $p2\n"; pg_query($db, "BEGIN WORK"); $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,waysource,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,waysource,the_geom,length,hdiff,costfactor) values ($gi,".$e['class_id'].",".$e['osm_id'].",".$e['source'].",".$e['target'].",'".$e['waysource']."',(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=$po; } } // echo "Teile liefert $ret\n"; return $ret; } function verbinde($db,$osm_id,$source,$target,$x1,$y1,$x2,$y2,$way){ // // Fuegt den den Weges von source/x1/x2 zu target/x2/y2 way mit der osm_id in den Graphen ein // $query="select max(gid) as m from routing_ways;"; $result=pg_query($db,$query); $e=pg_fetch_array($result); $gid=$e['m']+1; $q="insert into routing_ways (gid,class_id,osm_id,source,target,waysource,costfactor,hdiff) values ($gid,0,$osm_id,$source,$target,'virtual_area_way',1.0,0);"; $r=pg_query($db,$q); $q="update routing_ways set the_geom=st_transform(ST_GeomFromText('$way',900913),4326) 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 winkel($x1,$y1,$x2,$y2,$x3,$y3){ // // Gibt den Winkel an xy2 zurueck // $w1=rad2deg(atan2(($y2-$y1),($x2-$x1)));if($w1<0){$w1+=360;} $w2=rad2deg(atan2(($y3-$y2),($x3-$x2)));if($w2<0){$w2+=360;} $w=$w2-$w1; if($w>180 ){$w=$w-360;} if($w<-180){$w=$w+360;} // echo "Winkel: $w1 -> $w2 = $w \n"; return $w; } // ------------------------- hier gehts los $db=pg_pconnect('host=localhost port=5432 dbname=osm user=osm password=osm') or die("Keine DB, sonst alles in Ordnung"); // // Letzten Source/targe abholen, brauchen wir dann später // $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++; // // Alle Polygone holen // $placecount=$ringcount=0; // $query1="select osm_id,st_astext(way) as way from osm_pedestrian where osm_id=-1951581;"; // $query1="select osm_id,st_astext(way) as way from osm_pedestrian where st_contains((select way from osm_polygon where osm_id=-62428 order by way_area desc limit 1),way);"; // $query1="select osm_id,st_astext(way) as way from osm_pedestrian where osm_id='-1934891'"; // $query1="select osm_id,st_astext(way) as way from osm_pedestrian where osm_id='45697424'"; $query1="select osm_id,st_astext(way) as way from osm_pedestrian;"; // $query1="select osm_id,st_astext(way) as way from osm_pedestrian where (osm_id='-152653');"; // $query1="select osm_id,st_astext(way) as way from osm_pedestrian where (osm_id='33364851 ');"; $result1=pg_query($db,$query1); while($r1=pg_fetch_array($result1)) { $placecount++; $ringcount=0; $osm_id=$r1['osm_id']; $flaeche=$r1['way']; $query5="select ipoint from osm_pedestrian where osm_id='$osm_id' limit 1;"; $result5=pg_query($db,$query5); $r5=pg_fetch_array($result5); $ipo=split(',',$r5['ipoint']); if((count($ipo)>0)&&(count($ipo)<80)){ // // von jedem Polygon alle Ringe holen // $query2="select st_astext(st_transform((o.w).geom::geometry,900913)) as polygone,(o.w).path as path from (select ST_DumpRings((g.dump).geom) as w from (select st_dump(way) as dump from osm_pedestrian where osm_id='".$osm_id."') as g) as o;"; $result2=pg_query($db,$query2); $n=0;$i=0; while($r2=pg_fetch_array($result2)) { // // Aus jedem Ring alle Punkte holen // $polygone=$r2['polygone']; if($r2['path']=='{0}'){$exterior=1;}else{$exterior=0;} $ringcount++; echo "$placecount/$ringcount (e:$exterior von $osm_id ".$r2['path'].")\n"; $p2=split(',',str_ireplace(array('POLYGON','(',')'),'',$polygone)); for($j=0;$j0)){$stueckel=1;} if(($exterior==0) && ($wi>0)){$stueckel=1;} // echo "Versuche Teilung mit $po (n=$n stc=$stueckel ext=$exterior wi=$wi)\n"; $w[$n]=teilweg($db,$x[$n],$y[$n],$po,$stueckel); if($w[$n]>0){ if($w[$n]==$po){$po++;} $ex[$i]=$x[$n];$ey[$i]=$y[$n];$ew[$i]=$w[$n]; $rewinkel[$i]=$rewi; $liwinkel[$i]=$liwi; // echo "Nehme ".$w[$n]." in Graphen auf ReWi=$rewi LiWi=$liwi\n"; $i++; } } } } // // Notbremse: nicht mehr als 500 neue Knoten und 100 Hindernisse // if(($i<600)&&($ringcount<120)){ $query5="select ipoint from osm_pedestrian where osm_id='$osm_id' limit 1;"; $result5=pg_query($db,$query5); $r5=pg_fetch_array($result5); $ipo=split(',',$r5['ipoint']); // // von jedem zu jedem angelegten Punkt eine Linie ziehen, falls die innerhalb des Polygons liegt // for($k=0;$k<$i;$k++){ $kisipo=0; for($ii=0;$ii=0)&&($rewinkel[$j]>=0)&&($winkel< $rewinkel[$j] )){$qliegtrechts=1;} if(($winkel>=0)&&($rewinkel[$j] <0)&&($winkel> $rewinkel[$j]+180)){$qliegtrechts=1;} if(($winkel <0)&&($rewinkel[$j]>=0)&&($winkel> $rewinkel[$j]-180)){$qliegtrechts=1;} if(($winkel <0)&&($rewinkel[$j] <0)&&($winkel< $rewinkel[$j] )){$qliegtrechts=1;} if(($winkel>=0)&&($liwinkel[$j]>=0)&&($winkel> $liwinkel[$j] )){$qliegtlinks=1;} if(($winkel>=0)&&($liwinkel[$j] <0)&&($winkel< $liwinkel[$j]+180)){$qliegtlinks=1;} if(($winkel <0)&&($liwinkel[$j]>=0)&&($winkel< $liwinkel[$j]-180)){$qliegtlinks=1;} if(($winkel <0)&&($liwinkel[$j] <0)&&($winkel> $liwinkel[$j])) {$qliegtlinks=1;} if(($winkel2>=0)&&($rewinkel[$k]>=0)&&($winkel2< $rewinkel[$k] )){$zliegtrechts=1;} if(($winkel2>=0)&&($rewinkel[$k] <0)&&($winkel2> $rewinkel[$k]+180)){$zliegtrechts=1;} if(($winkel2 <0)&&($rewinkel[$k]>=0)&&($winkel2> $rewinkel[$k]-180)){$zliegtrechts=1;} if(($winkel2 <0)&&($rewinkel[$k] <0)&&($winkel2< $rewinkel[$k] )){$zliegtrechts=1;} if(($winkel2>=0)&&($liwinkel[$k]>=0)&&($winkel2> $liwinkel[$k] )){$zliegtlinks=1;} if(($winkel2>=0)&&($liwinkel[$k] <0)&&($winkel2< $liwinkel[$k]+180)){$zliegtlinks=1;} if(($winkel2 <0)&&($liwinkel[$k]>=0)&&($winkel2< $liwinkel[$k]-180)){$zliegtlinks=1;} if(($winkel2 <0)&&($liwinkel[$k] <0)&&($winkel2> $liwinkel[$k])) {$zliegtlinks=1;} if((($qliegtlinks==0)||($qliegtrechts==0)||($jisipo==1)) && (($zliegtlinks==0)||($zliegtrechts==0)||($kisipo==1))){ // echo "-------- Verbinde lili=$qliegtlinks lire=$qliegtrechts zu lili=$zliegtlinks lire=$zliegtrechts\n"; verbinde($db,$osm_id,$ew[$j],$ew[$k],$ex[$j],$ey[$j],$ex[$k],$ey[$k],$testweg); } } } } // // Danach die "weiteren wichtigen Punkte" holen, aber erst schaun, // ob die schon abgehandelt wurden // $query5="select ipoint from osm_pedestrian where osm_id='$osm_id' limit 1;"; $result5=pg_query($db,$query5); $r5=pg_fetch_array($result5); $ipo=split(',',$r5['ipoint']); for($k=0;$k