GRASS GIS 7 Programmer's Manual  7.7.svn(2018)-r73574
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
line.c File Reference

Vector library - vector feature geometry. More...

#include <stdlib.h>
#include <math.h>
#include <grass/vector.h>
#include <grass/glocale.h>
Include dependency graph for line.c:

Go to the source code of this file.

Functions

struct line_pntsVect__new_line_struct (void)
 Creates and initializes a struct line_pnts (internal use only) More...
 
struct line_pntsVect_new_line_struct ()
 Creates and initializes a line_pnts structure. More...
 
void Vect_destroy_line_struct (struct line_pnts *p)
 Frees all memory associated with a line_pnts structure, including the structure itself. More...
 
int Vect_copy_xyz_to_pnts (struct line_pnts *Points, const double *x, const double *y, const double *z, int n)
 Copy points from array to line_pnts structure. More...
 
void Vect_reset_line (struct line_pnts *Points)
 Reset line. More...
 
int Vect_append_point (struct line_pnts *Points, double x, double y, double z)
 Appends one point to the end of a line. More...
 
int Vect_line_insert_point (struct line_pnts *Points, int index, double x, double y, double z)
 Insert new point at index position and move all old points at that position and above up. More...
 
int Vect_line_delete_point (struct line_pnts *Points, int index)
 Delete point at given index and move all points above down. More...
 
int Vect_line_get_point (const struct line_pnts *Points, int index, double *x, double *y, double *z)
 Get line point of given index. More...
 
int Vect_get_num_line_points (const struct line_pnts *Points)
 Get number of line points. More...
 
int Vect_line_prune (struct line_pnts *Points)
 Remove duplicate points, i.e. zero length segments. More...
 
int Vect_line_prune_thresh (struct line_pnts *Points, double threshold)
 Remove points in threshold. More...
 
int Vect_append_points (struct line_pnts *Points, const struct line_pnts *APoints, int direction)
 Appends points to the end of a line. More...
 
int Vect_copy_pnts_to_xyz (const struct line_pnts *Points, double *x, double *y, double *z, int *n)
 Copy points from line structure to array. More...
 
int Vect_point_on_line (const struct line_pnts *Points, double distance, double *x, double *y, double *z, double *angle, double *slope)
 Find point on line in the specified distance. More...
 
int Vect_line_segment (const struct line_pnts *InPoints, double start, double end, struct line_pnts *OutPoints)
 Create line segment. More...
 
double Vect_line_length (const struct line_pnts *Points)
 Calculate line length, 3D-length in case of 3D vector line. More...
 
double Vect_line_geodesic_length (const struct line_pnts *Points)
 Calculate line length. More...
 
int Vect_line_distance (const struct line_pnts *points, double ux, double uy, double uz, int with_z, double *px, double *py, double *pz, double *dist, double *spdist, double *lpdist)
 Calculate distance of point to line. More...
 
int Vect_line_geodesic_distance (const struct line_pnts *points, double ux, double uy, double uz, int with_z, double *px, double *py, double *pz, double *dist, double *spdist, double *lpdist)
 Calculate geodesic distance of point to line in meters. More...
 
double Vect_points_distance (double x1, double y1, double z1, double x2, double y2, double z2, int with_z)
 Calculate distance of 2 points. More...
 
void Vect_line_box (const struct line_pnts *Points, struct bound_box *Box)
 Get bounding box of line. More...
 
void Vect_line_reverse (struct line_pnts *Points)
 Reverse the order of vertices. More...
 
int Vect_get_line_cat (const struct Map_info *Map, int line, int field)
 Fetches FIRST category number for given vector line and field. More...
 

Detailed Description

Vector library - vector feature geometry.

(C) 2001-2009 by the GRASS Development Team

This program is free software under the GNU General Public License (>=v2). Read the file COPYING that comes with GRASS for details.

Author
Original author CERL, probably Dave Gerdes or Mike Higgins.
Update to GRASS 5.7 Radim Blazek and David D. Gray.
Some updates for GRASS 7 by Martin Landa <landa.martin gmail.com>

Definition in file line.c.

Function Documentation

struct line_pnts * Vect__new_line_struct ( void  )

Creates and initializes a struct line_pnts (internal use only)

Use Vect_new_line_struct() instead.

Returns
pointer to allocated line_pnts structure
NULL on error

Definition at line 55 of file line.c.

References line_pnts::alloc_points, malloc(), line_pnts::n_points, NULL, line_pnts::x, line_pnts::y, and line_pnts::z.

Referenced by Vect_new_line_struct().

int Vect_append_point ( struct line_pnts Points,
double  x,
double  y,
double  z 
)
int Vect_append_points ( struct line_pnts Points,
const struct line_pnts APoints,
int  direction 
)

Appends points to the end of a line.

Note, this will append to whatever is in line_pnts structure. If you are re-using a line struct, be sure to clear out old data first by calling Vect_reset_line().

Parameters
Pointspointer to line_pnts structure
APointspoints to be included
directiondirection (GV_FORWARD, GV_BACKWARD)
Returns
new number of points
-1 on out of memory

Definition at line 337 of file line.c.

References dig_alloc_points(), GV_FORWARD, line_pnts::n_points, line_pnts::x, line_pnts::y, and line_pnts::z.

Referenced by V1_read_line_pg(), V2_read_line_pg(), Vect__get_area_points_nat(), Vect_line_buffer(), Vect_merge_lines(), and Vect_snap_line().

int Vect_copy_pnts_to_xyz ( const struct line_pnts Points,
double *  x,
double *  y,
double *  z,
int n 
)

Copy points from line structure to array.

x/y/z arrays MUST be at least as large as Points->n_points

Also note that n is a pointer to int.

Parameters
Pointspointer to line_pnts structure
x,y,zcoordinates arrays
nnumber of points
Returns
number of points copied

Definition at line 383 of file line.c.

References line_pnts::n_points, NULL, line_pnts::x, line_pnts::y, and line_pnts::z.

int Vect_copy_xyz_to_pnts ( struct line_pnts Points,
const double *  x,
const double *  y,
const double *  z,
int  n 
)

Copy points from array to line_pnts structure.

Parameters
Pointspointer to line_ptns structure
x,y,zarray of coordinates
nnumber of points to be copied
Returns
0 on success
-1 on out of memory

Definition at line 99 of file line.c.

References dig_alloc_points(), line_pnts::n_points, NULL, line_pnts::x, line_pnts::y, and line_pnts::z.

Referenced by P_Aux_to_Vector(), P_Sparse_Points(), Vect_line_check_intersection(), Vect_line_check_intersection2(), and Vect_read_ascii().

int Vect_get_line_cat ( const struct Map_info Map,
int  line,
int  field 
)

Fetches FIRST category number for given vector line and field.

Parameters
Mappointer to Map_info structure
lineline id
fieldlayer number
Returns
-1 no category
category number (>=0)

Definition at line 963 of file line.c.

References cat, G_debug(), NULL, Vect_cat_get(), Vect_new_cats_struct(), and Vect_read_line().

int Vect_get_num_line_points ( const struct line_pnts Points)

Get number of line points.

Parameters
Pointspointer to line_pnts structure
Returns
number of points

Definition at line 269 of file line.c.

References line_pnts::n_points.

Referenced by Vect_sfa_is_line_closed().

void Vect_line_box ( const struct line_pnts Points,
struct bound_box Box 
)

Get bounding box of line.

Parameters
Pointspointer to line_pnts structure
[out]Boxbounding box

Definition at line 922 of file line.c.

References dig_line_box().

Referenced by V1_read_next_line_nat(), V2_read_next_line_nat(), V2_read_next_line_ogr(), V2_read_next_line_pg(), and Vedit_bulk_labeling().

int Vect_line_delete_point ( struct line_pnts Points,
int  index 
)

Delete point at given index and move all points above down.

Parameters
Pointspointer to line_pnts structure
indexpoint (from 0 to Points->n_points-1)
Returns
number of points

Definition at line 211 of file line.c.

References _, G_fatal_error(), line_pnts::n_points, line_pnts::x, line_pnts::y, and line_pnts::z.

Referenced by Vect_clean_small_angles_at_nodes(), and Vedit_remove_vertex().

int Vect_line_distance ( const struct line_pnts points,
double  ux,
double  uy,
double  uz,
int  with_z,
double *  px,
double *  py,
double *  pz,
double *  dist,
double *  spdist,
double *  lpdist 
)

Calculate distance of point to line.

Sets (if not null):

  • px, py - point on line,
  • dist - distance to line,
  • spdist - distance to point on line from segment beginning,
  • lpdist - distance to point on line from line beginning along line
Parameters
pointspointer to line_pnts structure
ux,uy,uzpoint coordinates
with_zflag if to use z coordinate (3D calculation)
[out]px,py,pzpoint on line
[out]distdistance to line
[out]spdistdistance to point on line from segment beginning
[out]lpdistdistance to point on line from line beginning along line
Returns
nearest segment (first is 1)

Definition at line 651 of file line.c.

References dig_distance2_point_to_line(), line_pnts::n_points, NULL, line_pnts::x, line_pnts::y, and line_pnts::z.

Referenced by Vect_find_line_list(), Vect_line_check_intersection(), Vect_line_check_intersection2(), Vect_net_nearest_nodes(), Vedit_add_vertex(), and Vedit_split_lines().

int Vect_line_geodesic_distance ( const struct line_pnts points,
double  ux,
double  uy,
double  uz,
int  with_z,
double *  px,
double *  py,
double *  pz,
double *  dist,
double *  spdist,
double *  lpdist 
)

Calculate geodesic distance of point to line in meters.

Sets (if not null):

  • px, py - point on line,
  • dist - distance to line,
  • spdist - distance to point on line from segment beginning,
  • lpdist - distance to point on line from line beginning along line
Parameters
pointspointer to line_pnts structure
ux,uy,uzpoint coordinates
with_zflag if to use z coordinate (3D calculation)
[out]px,py,pzpoint on line
[out]distdistance to line
[out]spdistdistance to point on line from segment beginning
[out]lpdistdistance to point on line from line beginning along line
Returns
nearest segment (first is 1)

Definition at line 772 of file line.c.

References dig_distance2_point_to_line(), G_begin_distance_calculations(), G_distance(), line_pnts::n_points, NULL, line_pnts::x, line_pnts::y, and line_pnts::z.

double Vect_line_geodesic_length ( const struct line_pnts Points)

Calculate line length.

If projection is LL, the length is measured along the geodesic.

Parameters
Pointspointer to line_pnts structure geometry
Returns
line length

Definition at line 604 of file line.c.

References G_begin_distance_calculations(), G_geodesic_distance(), line_pnts::n_points, line_pnts::x, line_pnts::y, and line_pnts::z.

Referenced by Vect_get_area_perimeter(), Vect_net_build_graph(), and Vect_net_ttb_build_graph().

int Vect_line_get_point ( const struct line_pnts Points,
int  index,
double *  x,
double *  y,
double *  z 
)

Get line point of given index.

Calls G_fatal_error() when index is not range in.

Parameters
Pointspointer to line_pnts structure
indexpoint index (from 0 to Points->n_points-1)
xpointer to x coordinate or NULL
ypointer to y coordinate or NULL
zpointer to z coordinate or NULL
Returns
number of points

Definition at line 245 of file line.c.

References _, G_fatal_error(), line_pnts::n_points, line_pnts::x, line_pnts::y, and line_pnts::z.

int Vect_line_insert_point ( struct line_pnts Points,
int  index,
double  x,
double  y,
double  z 
)

Insert new point at index position and move all old points at that position and above up.

Parameters
Pointspointer to line_pnts structure
index(from 0 to Points->n_points-1)
x,y,zpoint coordinates
Returns
number of points
-1 on error (alocation)

Definition at line 177 of file line.c.

References _, dig_alloc_points(), G_fatal_error(), line_pnts::n_points, x, line_pnts::x, line_pnts::y, and line_pnts::z.

Referenced by Vedit_add_vertex().

double Vect_line_length ( const struct line_pnts Points)

Calculate line length, 3D-length in case of 3D vector line.

For Lat-Long use Vect_line_geodesic_length() instead.

Parameters
Pointspointer to line_pnts structure geometry
Returns
line length

Definition at line 576 of file line.c.

References line_pnts::n_points, line_pnts::x, line_pnts::y, and line_pnts::z.

Referenced by Vect_line_segment(), Vect_net_build_graph(), Vect_net_nearest_nodes(), Vect_net_ttb_build_graph(), Vect_point_on_line(), Vect_remove_small_areas_ext(), Vect_remove_small_areas_nat(), Vect_topo_check(), Vedit_bulk_labeling(), and Vedit_split_lines().

int Vect_line_prune_thresh ( struct line_pnts Points,
double  threshold 
)

Remove points in threshold.

Parameters
Pointspointer to line_pnts structure
thresholdthreshold value
Returns
number of points in result

Definition at line 311 of file line.c.

References dig_prune(), and line_pnts::n_points.

void Vect_line_reverse ( struct line_pnts Points)

Reverse the order of vertices.

Parameters
Pointspointer to line_pnts structure to be changed

Definition at line 932 of file line.c.

References for(), int, line_pnts::n_points, x, line_pnts::x, line_pnts::y, and line_pnts::z.

Referenced by Vedit_flip_lines().

int Vect_line_segment ( const struct line_pnts InPoints,
double  start,
double  end,
struct line_pnts OutPoints 
)

Create line segment.

Creates segment of InPoints from start to end measured along the line and write it to OutPoints.

If the distance is greater than line length or negative, error is returned.

Parameters
InPointsinput line
startsegment number
endsegment number
OutPointsoutput line
Returns
1 success
0 error when start > length or end < 0 or start < 0 or end > length

Definition at line 518 of file line.c.

References _, G_debug(), G_warning(), line_pnts::n_points, NULL, Vect_append_point(), Vect_line_length(), Vect_line_prune(), Vect_point_on_line(), Vect_reset_line(), line_pnts::x, line_pnts::y, and line_pnts::z.

struct line_pnts* Vect_new_line_struct ( )

Creates and initializes a line_pnts structure.

This structure is used for reading and writing vector lines and polygons. The library routines handle all memory allocation. If 3 lines in memory are needed at the same time, then simply 3 line_pnts structures have to be used.

To free allocated memory call Vect_destroy_line_struct().

Calls G_fatal_error() on error.

Returns
pointer to line_pnts

Definition at line 45 of file line.c.

References _, G_fatal_error(), NULL, and Vect__new_line_struct().

Referenced by Gp_load_sites(), Gv_load_vect(), I_rasterize(), IL_vector_input_data_2d(), NetA_add_point_on_node(), NetA_get_node_costs(), NetA_points_to_nodes(), NetA_varray_to_nodes(), P_Aux_to_Vector(), P_estimate_splinestep(), P_Read_Vector_Region_Map(), P_Sparse_Points(), V1_rewrite_line_nat(), V2_delete_line_nat(), V2_delete_line_pg(), V2_delete_line_sfa(), V2_restore_line_nat(), V2_rewrite_line_nat(), V2_rewrite_line_pg(), V2_write_line_sfa(), Vect__copy_areas(), Vect__get_area_points_nat(), Vect_area_buffer2(), Vect_break_polygons_file(), Vect_break_polygons_mem(), Vect_build_line_area(), Vect_build_nat(), Vect_clean_small_angles_at_nodes(), Vect_find_island(), Vect_find_line_list(), Vect_get_area_area(), Vect_get_area_perimeter(), Vect_get_line_box(), Vect_get_map_box1(), Vect_get_point_in_area(), Vect_get_point_in_poly_isl(), Vect_line_buffer(), Vect_line_buffer2(), Vect_line_check_intersection(), Vect_line_check_intersection2(), Vect_line_intersection(), Vect_line_intersection2(), Vect_merge_lines(), Vect_net_build_graph(), Vect_net_nearest_nodes(), Vect_net_ttb_build_graph(), Vect_overlay_and(), Vect_point_buffer2(), Vect_point_in_area_outer_ring(), Vect_point_in_island(), Vect_read_ascii(), Vect_read_line_to_wkb(), Vect_remove_duplicates(), Vect_remove_small_areas_ext(), Vect_remove_small_areas_nat(), Vect_select_lines_by_polygon(), Vect_snap_line(), Vect_tin_get_z(), Vect_topo_check(), Vect_write_ascii(), vector2perimeters(), Vedit_add_vertex(), Vedit_bulk_labeling(), Vedit_chtype_lines(), Vedit_copy_lines(), Vedit_flip_lines(), Vedit_merge_lines(), Vedit_modify_cats(), Vedit_move_lines(), Vedit_move_vertex(), Vedit_remove_vertex(), Vedit_select_by_query(), Vedit_snap_lines(), Vedit_snap_point(), and Vedit_split_lines().

int Vect_point_on_line ( const struct line_pnts Points,
double  distance,
double *  x,
double *  y,
double *  z,
double *  angle,
double *  slope 
)

Find point on line in the specified distance.

From the beginning, measured along line.

If the distance is greater than line length or negative, error is returned.

Parameters
Pointspointer to line_pnts structure
distancedistance value
x,y,zpointers to point coordinates or NULL
anglepointer to angle of line in that point (radians, counter clockwise from x axis) or NULL
slopepointer to slope angle in radians (positive up)
Returns
number of segment the point is on (first is 1),
0 error when point is outside the line

Definition at line 415 of file line.c.

References G_debug(), line_pnts::n_points, NULL, Vect_line_length(), line_pnts::x, line_pnts::y, and line_pnts::z.

Referenced by Vect_line_segment().

double Vect_points_distance ( double  x1,
double  y1,
double  z1,
double  x2,
double  y2,
double  z2,
int  with_z 
)

Calculate distance of 2 points.

Simply uses Pythagoras.

Parameters
x1,y1,z1first point
x2,y2,z2second point
with_zuse z coordinate
Returns
distance

Definition at line 898 of file line.c.

Referenced by Vect_clean_small_angles_at_nodes(), Vect_find_node(), Vedit_add_vertex(), Vedit_get_min_distance(), Vedit_move_vertex(), Vedit_remove_vertex(), Vedit_snap_line(), and Vedit_snap_point().