Exemple #1
0
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;
}