function crop_ways_to_box(&$input_osm_ways, $min_lat, $min_lon, $max_lat, $max_lon, $verbose) { if ($verbose) { error_log("Starting way cropping"); } $clipping_planes = get_clipping_planes_for_box($min_lat, $min_lon, $max_lat, $max_lon); $input_nodes = $input_osm_ways->nodes; $input_ways = $input_osm_ways->ways; $result = new OSMWays(); $count = 0; foreach ($input_ways as $input_way) { $count += 1; if ($verbose && $count % 1000 === 0) { error_log("Processing {$count}/" . count($input_ways)); } $nds = $input_way['nds']; if (empty($nds)) { continue; } $output_vertices = array(); foreach ($nds as $nd_ref) { $current_vertex = $input_nodes[$nd_ref]; $output_vertices[] = $current_vertex; } foreach ($clipping_planes as $plane) { $output_vertices = clip_vertices_against_plane($output_vertices, $plane, $verbose); } if (empty($output_vertices)) { continue; } $result->begin_way(); foreach ($input_way['tags'] as $key => $value) { $result->add_tag($key, $value); } foreach ($output_vertices as $vertex) { $result->add_vertex($vertex['lat'], $vertex['lon']); } if ($input_way['is_closed']) { $result->force_closed(); } $result->end_way(); } if ($verbose) { error_log("Finished way cropping"); } return $result; }