Changeset 66593


Ignore:
Timestamp:
Oct 24, 2015, 7:52:29 PM (9 years ago)
Author:
wenzeslaus
Message:

r.in.lidar: separate code for base raster

But leaving the two options (row array and segment) in the main code.

Location:
grass/trunk/raster/r.in.lidar
Files:
2 added
3 edited

Legend:

Unmodified
Added
Removed
  • grass/trunk/raster/r.in.lidar/local_proto.h

    r57946 r66593  
    5353int update_sumsq(void *, int, int, int, RASTER_MAP_TYPE, double);
    5454
     55/* raster reading */
     56int row_array_get_value_row_col(void *array, int arr_row, int arr_col,
     57                                int cols, RASTER_MAP_TYPE rtype, double *value);
    5558
    5659#endif /* __LOCAL_PROTO_H__ */
  • grass/trunk/raster/r.in.lidar/main.c

    r66592 r66593  
    2929#include <grass/glocale.h>
    3030#include <liblas/capi/liblas.h>
     31
    3132#include "local_proto.h"
     33#include "rast_segment.h"
    3234
    3335struct node
     
    672674    if (base_raster_opt->answer && (res_opt->answer || use_base_raster_res))
    673675        use_segment = 1;
    674     if (base_raster_opt->answer) {
     676    if (base_raster_opt->answer && !use_segment) {
     677        /* TODO: do we need to test existence first? mapset? */
     678        base_raster = Rast_open_old(base_raster_opt->answer, "");
     679        base_raster_data_type = Rast_get_map_type(base_raster);
     680        base_array = G_calloc((size_t)rows * (cols + 1), Rast_cell_size(base_raster_data_type));
     681    }
     682    if (base_raster_opt->answer && use_segment) {
    675683        if (use_base_raster_res) {
    676684            /* TODO: how to get cellhd already stored in the open map? */
     
    679687            Rast_set_input_window(&input_region);  /* we have split window */
    680688        }
    681         /* TODO: do we need to test existence first? mapset? */
    682         base_raster = Rast_open_old(base_raster_opt->answer, "");
    683         base_raster_data_type = Rast_get_map_type(base_raster);
    684     }
    685     if (base_raster_opt->answer && use_segment) {
    686         if (!use_base_raster_res)
    687             Rast_get_input_window(&input_region);  /* we have split window */
    688         /* TODO: these numbers does not fit with what we promise about percentage */
    689         int segment_rows = 64;
    690         /* writing goes row by row, so we use long segments as well */
    691         int segment_cols = cols;
    692         int segments_in_memory = 4;
    693         if (Segment_open(&base_segment, G_tempfile(), input_region.rows, input_region.cols,
    694                 segment_rows, segment_cols,
    695                 Rast_cell_size(base_raster_data_type), segments_in_memory) != 1)
    696             G_fatal_error(_("Cannot create temporary file with segments of a raster map"));
    697         for (row = 0; row < input_region.rows; row++) {
    698             raster_row = Rast_allocate_input_buf(base_raster_data_type);
    699             Rast_get_row(base_raster, raster_row, row, base_raster_data_type);
    700             Segment_put_row(&base_segment, raster_row, row);
    701         }
    702         Rast_close(base_raster);  /* we won't need the raster again */
     689        rast_segment_open(&base_segment, base_raster_opt->answer, &base_raster_data_type);
    703690    }
    704691
     
    727714            index_array =
    728715                G_calloc((size_t)rows * (cols + 1), Rast_cell_size(CELL_TYPE));
    729         if (base_raster_opt->answer && !use_segment)
    730             base_array = G_calloc((size_t)rows * (cols + 1), Rast_cell_size(base_raster_data_type));
    731         /* we don't free the raster, we just use it again */
    732716        /* TODO: perhaps none of them needs to be freed */
    733717
     
    910894
    911895            if (base_array) {
    912                 ptr = base_array;
    913                 ptr =
    914                     G_incr_void_ptr(ptr,
    915                                     ((arr_row * cols) +
    916                                      arr_col) * Rast_cell_size(base_raster_data_type));
    917 
    918896                double base_z;
    919                 if (Rast_is_null_value(ptr, base_raster_data_type)) {
     897                if (row_array_get_value_row_col(base_array, arr_row, arr_col,
     898                                                cols, base_raster_data_type,
     899                                                &base_z))
     900                    z -= base_z;
     901                else
    920902                    continue;
    921                 }
    922                 else {
    923                     if (base_raster_data_type == DCELL_TYPE)
    924                         base_z = *(DCELL *) ptr;
    925                     else if (base_raster_data_type == FCELL_TYPE)
    926                         base_z = (double) *(FCELL *) ptr;
    927                     else
    928                         base_z = (double) *(CELL *) ptr;
    929                 }
    930                 z -= base_z;
    931903            }
    932904            else if (use_segment) {
    933905                double base_z;
    934                 /* Rast gives double, Segment needs off_t */
    935                 off_t base_row = Rast_northing_to_row(y, &input_region);
    936                 off_t base_col = Rast_easting_to_col(x, &input_region);
    937                 /* skip points which are outside the base raster
    938                  * (null propagation) */
    939                 if (base_row < 0 || base_col < 0 ||
    940                         base_row >= input_region.rows ||
    941                         base_col >= input_region.cols)
     906                if (rast_segment_get_value_xy(&base_segment, &input_region,
     907                                              base_raster_data_type, x, y,
     908                                              &base_z))
     909                    z -= base_z;
     910                else
    942911                    continue;
    943                 if (base_raster_data_type == DCELL_TYPE) {
    944                     DCELL value;
    945                     Segment_get(&base_segment, &value, base_row, base_col);
    946                     if (Rast_is_null_value(&value, base_raster_data_type))
    947                         continue;
    948                     base_z = value;
    949                 }
    950                 else if (base_raster_data_type == FCELL_TYPE) {
    951                    
    952                    
    953                     FCELL value;
    954                     Segment_get(&base_segment, &value, base_row, base_col);
    955                     if (Rast_is_null_value(&value, base_raster_data_type))
    956                         continue;
    957                     base_z = value;
    958                 }
    959                 else {
    960                     CELL value;
    961                     Segment_get(&base_segment, &value, base_row, base_col);
    962                     if (Rast_is_null_value(&value, base_raster_data_type))
    963                         continue;
    964                     base_z = value;
    965                 }
    966                 z -= base_z;
    967912            }
    968913
  • grass/trunk/raster/r.in.lidar/support.c

    r46570 r66593  
    129129    return 0;
    130130}
     131
     132/* 0 on NULL, 1 on success */
     133int row_array_get_value_row_col(void *array, int arr_row, int arr_col,
     134                                int cols, RASTER_MAP_TYPE rtype, double *value)
     135{
     136    void *ptr = array;
     137    ptr =
     138        G_incr_void_ptr(ptr,
     139                        ((arr_row * cols) +
     140                         arr_col) * Rast_cell_size(rtype));
     141    if (Rast_is_null_value(ptr, rtype))
     142        return 0;
     143    if (rtype == DCELL_TYPE)
     144        *value = (double) *(DCELL *) ptr;
     145    else if (rtype == FCELL_TYPE)
     146        *value = (double) *(FCELL *) ptr;
     147    else
     148        *value = (double) *(CELL *) ptr;
     149    return 1;
     150}
Note: See TracChangeset for help on using the changeset viewer.