QgsGeometry QgsTransectAlgorithm::calcTransect( const QgsPoint &point, const double angleAtVertex, const double length, const QgsTransectAlgorithm::Side orientation, const double angle ) { QgsPoint pLeft; // left point of the line QgsPoint pRight; // right point of the line QgsPolyline line; if ( ( orientation == QgsTransectAlgorithm::Right ) || ( orientation == QgsTransectAlgorithm::Both ) ) { pLeft = point.project( length, angle + 180.0 / M_PI * angleAtVertex ); if ( orientation != QgsTransectAlgorithm::Both ) pRight = point; } if ( ( orientation == QgsTransectAlgorithm::Left ) || ( orientation == QgsTransectAlgorithm::Both ) ) { pRight = point.project( -length, angle + 180.0 / M_PI * angleAtVertex ); if ( orientation != QgsTransectAlgorithm::Both ) pLeft = point; } line.append( pLeft ); line.append( pRight ); return QgsGeometry::fromPolyline( line ); }
unsigned char* QgsGeometryAnalyzer::locateBetweenWkbString( unsigned char* ptr, QgsMultiPolyline& result, double fromMeasure, double toMeasure ) { int* nPoints = ( int* ) ptr; ptr += sizeof( int ); double prevx = 0.0, prevy = 0.0, prevz = 0.0; double *x, *y, *z; QgsPolyline currentLine; QgsPoint pt1, pt2; bool measureInSegment; //true if measure is contained in the segment bool secondPointClipped; //true if second point is != segment endpoint for ( int i = 0; i < *nPoints; ++i ) { x = ( double* )ptr; ptr += sizeof( double ); y = ( double* )ptr; ptr += sizeof( double ); z = ( double* ) ptr; ptr += sizeof( double ); if ( i > 0 ) { measureInSegment = clipSegmentByRange( prevx, prevy, prevz, *x, *y, *z, fromMeasure, toMeasure, pt1, pt2, secondPointClipped ); if ( measureInSegment ) { if ( currentLine.size() < 1 ) //no points collected yet, so the first point needs to be added to the line { currentLine.append( pt1 ); } if ( pt1 != pt2 ) //avoid duplicated entry if measure value equals m-value of vertex { currentLine.append( pt2 ); } if ( secondPointClipped || i == *nPoints - 1 ) //close current segment { if ( currentLine.size() > 1 ) { result.append( currentLine ); } currentLine.clear(); } } } prevx = *x; prevy = *y; prevz = *z; } return ptr; }
QgsAbstractGeometryV2* QgsGeometryImport::fromRect( const QgsRectangle& rect ) { QgsPolyline ring; ring.append( QgsPoint( rect.xMinimum(), rect.yMinimum() ) ); ring.append( QgsPoint( rect.xMaximum(), rect.yMinimum() ) ); ring.append( QgsPoint( rect.xMaximum(), rect.yMaximum() ) ); ring.append( QgsPoint( rect.xMinimum(), rect.yMaximum() ) ); ring.append( QgsPoint( rect.xMinimum(), rect.yMinimum() ) ); QgsPolygon polygon; polygon.append( ring ); return fromPolygon( polygon ); }
QgsPolyline QgsRubberBand::getPolyline( const QList<QgsPoint> & points ) { QgsPolyline polyline; QList<QgsPoint>::const_iterator iter = points.constBegin(); for ( ; iter != points.constEnd(); ++iter ) { polyline.append( *iter ); } return polyline; }
double QgsGrassGisLib::G_area_of_polygon( const double *x, const double *y, int n ) { QgsPolyline polyline; for ( int i = 0; i < n; i++ ) { polyline.append( QgsPoint( x[i], y[i] ) ); } QgsPolygon polygon; polygon.append( polyline ); QgsGeometry* geo = QgsGeometry::fromPolygon( polygon ); double area = mDistanceArea.measure( geo ); delete geo; if ( !mCrs.geographicFlag() ) { area *= qPow( G_database_units_to_meters_factor(), 2 ); } return area; }
QgsPolyline QgsOSMDatabase::wayPoints( QgsOSMId id ) const { QgsPolyline points; // bind the way identifier sqlite3_bind_int64( mStmtWayNodePoints, 1, id ); while ( sqlite3_step( mStmtWayNodePoints ) == SQLITE_ROW ) { if ( sqlite3_column_type( mStmtWayNodePoints, 0 ) == SQLITE_NULL ) return QgsPolyline(); // missing some nodes double lon = sqlite3_column_double( mStmtWayNodePoints, 0 ); double lat = sqlite3_column_double( mStmtWayNodePoints, 1 ); points.append( QgsPoint( lon, lat ) ); } sqlite3_reset( mStmtWayNodePoints ); return points; }
void QgsDxfPalLabeling::drawLabel( pal::LabelPosition* label, QgsRenderContext& context, QgsPalLayerSettings& tmpLyr, DrawLabelType drawType, double dpiRatio ) { Q_UNUSED( context ); Q_UNUSED( drawType ); Q_UNUSED( dpiRatio ); if ( drawType == QgsPalLabeling::LabelBuffer ) { return; } //debug: print label infos if ( mDxfExport ) { QgsPalGeometry *g = dynamic_cast< QgsPalGeometry* >( label->getFeaturePart()->getUserGeometry() ); if ( !g ) return; //label text QString txt = g->text( label->getPartId() ); //angle double angle = label->getAlpha() * 180 / M_PI; //debug: show label rectangle #if 0 QgsPolyline line; for ( int i = 0; i < 4; ++i ) { line.append( QgsPoint( label->getX( i ), label->getY( i ) ) ); } mDxfExport->writePolyline( line, g->dxfLayer(), "CONTINUOUS", 1, 0.01, true ); #endif QString wrapchr = tmpLyr.wrapChar.isEmpty() ? "\n" : tmpLyr.wrapChar; //add the direction symbol if needed if ( !txt.isEmpty() && tmpLyr.placement == QgsPalLayerSettings::Line && tmpLyr.addDirectionSymbol ) { bool prependSymb = false; QString symb = tmpLyr.rightDirectionSymbol; if ( label->getReversed() ) { prependSymb = true; symb = tmpLyr.leftDirectionSymbol; } if ( tmpLyr.reverseDirectionSymbol ) { if ( symb == tmpLyr.rightDirectionSymbol ) { prependSymb = true; symb = tmpLyr.leftDirectionSymbol; } else { prependSymb = false; symb = tmpLyr.rightDirectionSymbol; } } if ( tmpLyr.placeDirectionSymbol == QgsPalLayerSettings::SymbolAbove ) { prependSymb = true; symb = symb + wrapchr; } else if ( tmpLyr.placeDirectionSymbol == QgsPalLayerSettings::SymbolBelow ) { prependSymb = false; symb = wrapchr + symb; } if ( prependSymb ) { txt.prepend( symb ); } else { txt.append( symb ); } } txt = txt.replace( wrapchr, "\\P" ); if ( tmpLyr.textFont.underline() ) { txt.prepend( "\\L" ).append( "\\l" ); } if ( tmpLyr.textFont.overline() ) { txt.prepend( "\\O" ).append( "\\o" ); } if ( tmpLyr.textFont.strikeOut() ) { txt.prepend( "\\K" ).append( "\\k" ); } txt.prepend( QString( "\\f%1|i%2|b%3;\\H%4;\\W0.75;" ) .arg( tmpLyr.textFont.family() ) .arg( tmpLyr.textFont.italic() ? 1 : 0 ) .arg( tmpLyr.textFont.bold() ? 1 : 0 ) .arg( label->getHeight() / ( 1 + txt.count( "\\P" ) ) * 0.75 ) ); mDxfExport->writeMText( g->dxfLayer(), txt, QgsPoint( label->getX(), label->getY() ), label->getWidth() * 1.1, angle, tmpLyr.textColor ); } }