Changeset 66593
- Timestamp:
- Oct 24, 2015, 7:52:29 PM (9 years ago)
- Location:
- grass/trunk/raster/r.in.lidar
- Files:
-
- 2 added
- 3 edited
-
local_proto.h (modified) (1 diff)
-
main.c (modified) (5 diffs)
-
rast_segment.c (added)
-
rast_segment.h (added)
-
support.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
grass/trunk/raster/r.in.lidar/local_proto.h
r57946 r66593 53 53 int update_sumsq(void *, int, int, int, RASTER_MAP_TYPE, double); 54 54 55 /* raster reading */ 56 int row_array_get_value_row_col(void *array, int arr_row, int arr_col, 57 int cols, RASTER_MAP_TYPE rtype, double *value); 55 58 56 59 #endif /* __LOCAL_PROTO_H__ */ -
grass/trunk/raster/r.in.lidar/main.c
r66592 r66593 29 29 #include <grass/glocale.h> 30 30 #include <liblas/capi/liblas.h> 31 31 32 #include "local_proto.h" 33 #include "rast_segment.h" 32 34 33 35 struct node … … 672 674 if (base_raster_opt->answer && (res_opt->answer || use_base_raster_res)) 673 675 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) { 675 683 if (use_base_raster_res) { 676 684 /* TODO: how to get cellhd already stored in the open map? */ … … 679 687 Rast_set_input_window(&input_region); /* we have split window */ 680 688 } 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); 703 690 } 704 691 … … 727 714 index_array = 728 715 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 */732 716 /* TODO: perhaps none of them needs to be freed */ 733 717 … … 910 894 911 895 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 918 896 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 920 902 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 else928 base_z = (double) *(CELL *) ptr;929 }930 z -= base_z;931 903 } 932 904 else if (use_segment) { 933 905 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 942 911 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;967 912 } 968 913 -
grass/trunk/raster/r.in.lidar/support.c
r46570 r66593 129 129 return 0; 130 130 } 131 132 /* 0 on NULL, 1 on success */ 133 int 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.
