MCPcopy Create free account
hub / github.com/MapServer/MapServer / msPolylineComputeLineSegments

Function msPolylineComputeLineSegments

mapprimitive.c:1517–1553  ·  view source on GitHub ↗

Compute all the lineString/segment lengths and determine the longest lineString of a multiLineString * shape: in paramater, the multiLineString to compute. * segment_lengths: out parameter, the segment lengths of all lineString. * line_lengths: out parameter, the lineString lengths of the multiLineString. * max_line_index: out parameter, the index of the longest lineString of the multiLineSt

Source from the content-addressed store, hash-verified

1515 * segment_index: out parameter, the index of the longest lineString of the multiLineString.
1516*/
1517void msPolylineComputeLineSegments(shapeObj *shape, double ***segment_lengths, double **line_lengths, int *max_line_index, double *max_line_length, int *segment_index, double *total_length)
1518{
1519 int i, j, temp_segment_index;
1520 double segment_length, max_segment_length;
1521
1522 (*segment_lengths) = (double **) msSmallMalloc(sizeof(double *) * shape->numlines);
1523 (*line_lengths) = (double *) msSmallMalloc(sizeof(double) * shape->numlines);
1524
1525 temp_segment_index = *segment_index = *max_line_index = 0;
1526
1527 *total_length = 0;
1528 *max_line_length = 0;
1529 for(i=0; i<shape->numlines; i++) {
1530
1531 (*segment_lengths)[i] = (double*) msSmallMalloc(sizeof(double) * shape->line[i].numpoints);
1532
1533 (*line_lengths)[i] = 0;
1534 max_segment_length = 0;
1535 for(j=1;j<shape->line[i].numpoints;j++) {
1536 segment_length = sqrt((((shape->line[i].point[j].x-shape->line[i].point[j-1].x)*(shape->line[i].point[j].x-shape->line[i].point[j-1].x)) + ((shape->line[i].point[j].y-shape->line[i].point[j-1].y)*(shape->line[i].point[j].y-shape->line[i].point[j-1].y))));
1537 (*line_lengths)[i] += segment_length;
1538 (*segment_lengths)[i][j-1] = segment_length;
1539 if(segment_length > max_segment_length) {
1540 max_segment_length = segment_length;
1541 temp_segment_index = j;
1542 }
1543 }
1544
1545 *total_length += (*line_lengths)[i];
1546
1547 if((*line_lengths)[i] > *max_line_length) {
1548 *max_line_length = (*line_lengths)[i];
1549 *max_line_index = i;
1550 *segment_index = temp_segment_index;
1551 }
1552 }
1553}
1554
1555/*
1556** If no repeatdistance, find center of longest segment in polyline p. The polyline must have been converted

Callers 2

msPolylineLabelPathFunction · 0.85

Calls 1

msSmallMallocFunction · 0.85

Tested by

no test coverage detected