void TestQgsGeometrySnapper::snapPointToLine() { QgsVectorLayer* rl = new QgsVectorLayer( QStringLiteral( "Linestring" ), QStringLiteral( "x" ), QStringLiteral( "memory" ) ); // closed linestring QgsGeometry refGeom = QgsGeometry::fromWkt( QStringLiteral( "LineString(0 0, 10 0, 10 10, 0 10, 0 0)" ) ); QgsFeature ff( 0 ); ff.setGeometry( refGeom ); QgsFeatureList flist; flist << ff; rl->dataProvider()->addFeatures( flist ); QgsGeometry pointGeom = QgsGeometry::fromWkt( QStringLiteral( "Point(0.1 -0.1)" ) ); QgsGeometrySnapper snapper( rl ); QgsGeometry result = snapper.snapGeometry( pointGeom, 1 ); QCOMPARE( result.exportToWkt(), QStringLiteral( "Point (0 0)" ) ); pointGeom = QgsGeometry::fromWkt( QStringLiteral( "Point(10.6 -0.1)" ) ); result = snapper.snapGeometry( pointGeom, 1 ); QCOMPARE( result.exportToWkt(), QStringLiteral( "Point (10 0)" ) ); pointGeom = QgsGeometry::fromWkt( QStringLiteral( "Point(0.5 0.5)" ) ); result = snapper.snapGeometry( pointGeom, 1 ); QCOMPARE( result.exportToWkt(), QStringLiteral( "Point (0 0)" ) ); }
void TestQgsGeometrySnapper::snapPolygonToPolygon() { QgsVectorLayer* rl = new QgsVectorLayer( QStringLiteral( "Polygon" ), QStringLiteral( "x" ), QStringLiteral( "memory" ) ); QgsFeature ff( 0 ); QgsGeometry refGeom = QgsGeometry::fromWkt( QStringLiteral( "Polygon((0 0, 10 0, 10 10, 0 10, 0 0))" ) ); ff.setGeometry( refGeom ); QgsFeatureList flist; flist << ff; rl->dataProvider()->addFeatures( flist ); QgsGeometry polygonGeom = QgsGeometry::fromWkt( QStringLiteral( "Polygon((0.1 -0.1, 10.1 0, 9.9 10.1, 0 10, 0.1 -0.1))" ) ); QgsGeometrySnapper snapper( rl ); QgsGeometry result = snapper.snapGeometry( polygonGeom, 1 ); QCOMPARE( result.exportToWkt(), QStringLiteral( "Polygon ((0 0, 10 0, 10 10, 0 10, 0 0))" ) ); QgsGeometry polygonGeom2 = QgsGeometry::fromWkt( QStringLiteral( "Polygon((0.1 -0.1, 10.1 0, 0 10, 0.1 -0.1))" ) ); result = snapper.snapGeometry( polygonGeom2, 1 ); QCOMPARE( result.exportToWkt(), QStringLiteral( "Polygon ((0 0, 10 0, 0 10, 0 0))" ) ); // insert new vertex QgsGeometry polygonGeom3 = QgsGeometry::fromWkt( QStringLiteral( "Polygon((0.1 -0.1, 20.5 0.5, 20 10, 0 9.9, 0.1 -0.1))" ) ); result = snapper.snapGeometry( polygonGeom3, 1 ); QCOMPARE( result.exportToWkt(), QStringLiteral( "Polygon ((0 0, 10 0, 20.5 0.5, 20 10, 10 10, 0 10, 0 0))" ) ); // remove vertex QgsGeometry polygonGeom4 = QgsGeometry::fromWkt( QStringLiteral( "Polygon((0.1 -0.1, 10.1 0, 9.9 10.1, 5 10, 0 10, 0.1 -0.1))" ) ); result = snapper.snapGeometry( polygonGeom4, 1 ); QCOMPARE( result.exportToWkt(), QStringLiteral( "Polygon ((0 0, 10 0, 10 10, 0 10, 0 0))" ) ); }
void TestQgsGeometrySnapper::snapLineToPoint() { QgsVectorLayer* rl = new QgsVectorLayer( QStringLiteral( "Point" ), QStringLiteral( "x" ), QStringLiteral( "memory" ) ); QgsGeometry refGeom = QgsGeometry::fromWkt( QStringLiteral( "Point(0 0)" ) ); QgsFeature ff( 0 ); ff.setGeometry( refGeom ); QgsGeometry refGeom2 = QgsGeometry::fromWkt( QStringLiteral( "Point(10 0)" ) ); QgsFeature ff2( 2 ); ff2.setGeometry( refGeom2 ); QgsFeatureList flist; flist << ff << ff2; rl->dataProvider()->addFeatures( flist ); QgsGeometry lineGeom = QgsGeometry::fromWkt( QStringLiteral( "LineString(0.1 -0.1, 10.1 0, 10 10, 0 10)" ) ); QgsGeometrySnapper snapper( rl ); QgsGeometry result = snapper.snapGeometry( lineGeom, 1 ); QCOMPARE( result.exportToWkt(), QStringLiteral( "LineString (0 0, 10 0, 10 10, 0 10)" ) ); QgsGeometry lineGeom2 = QgsGeometry::fromWkt( QStringLiteral( "LineString(0.1 -0.1, 10.1 0, 0 10)" ) ); result = snapper.snapGeometry( lineGeom2, 1 ); QCOMPARE( result.exportToWkt(), QStringLiteral( "LineString (0 0, 10 0, 0 10)" ) ); // insert new vertex QgsGeometry lineGeom3 = QgsGeometry::fromWkt( QStringLiteral( "LineString(0.1 -0.1, 20.0 0.0, 20 10, 0 10)" ) ); result = snapper.snapGeometry( lineGeom3, 1 ); QCOMPARE( result.exportToWkt(), QStringLiteral( "LineString (0 0, 10 0, 20 0, 20 10, 0 10)" ) ); }
void TestQgsGeometrySnapper::snapPolygonToLine() { QgsVectorLayer* rl = new QgsVectorLayer( QStringLiteral( "Linestring" ), QStringLiteral( "x" ), QStringLiteral( "memory" ) ); // closed linestring QgsGeometry refGeom = QgsGeometry::fromWkt( QStringLiteral( "LineString(0 0, 10 0, 10 10, 0 10, 0 0)" ) ); QgsFeature ff( 0 ); ff.setGeometry( refGeom ); // unclosed linestring QgsGeometry refGeom2 = QgsGeometry::fromWkt( QStringLiteral( "LineString(100 0, 110 0, 110 10, 100 10)" ) ); QgsFeature ff2( 2 ); ff2.setGeometry( refGeom2 ); QgsFeatureList flist; flist << ff << ff2; rl->dataProvider()->addFeatures( flist ); // snapping to closed linestring QgsGeometry polygonGeom = QgsGeometry::fromWkt( QStringLiteral( "Polygon((0.1 -0.1, 10.1 0, 9.9 10.1, 0 10, 0.1 -0.1))" ) ); QgsGeometrySnapper snapper( rl ); QgsGeometry result = snapper.snapGeometry( polygonGeom, 1 ); QCOMPARE( result.exportToWkt(), QStringLiteral( "Polygon ((0 0, 10 0, 10 10, 0 10, 0 0))" ) ); QgsGeometry polygonGeom2 = QgsGeometry::fromWkt( QStringLiteral( "Polygon((0.1 -0.1, 10.1 0, 0 10, 0.1 -0.1))" ) ); result = snapper.snapGeometry( polygonGeom2, 1 ); QCOMPARE( result.exportToWkt(), QStringLiteral( "Polygon ((0 0, 10 0, 0 10, 0 0))" ) ); // insert new vertex QgsGeometry polygonGeom3 = QgsGeometry::fromWkt( QStringLiteral( "Polygon((0.1 -0.1, 20.5 0.5, 20 10, 0 9.9, 0.1 -0.1))" ) ); result = snapper.snapGeometry( polygonGeom3, 1 ); QCOMPARE( result.exportToWkt(), QStringLiteral( "Polygon ((0 0, 10 0, 20.5 0.5, 20 10, 10 10, 0 10, 0 0))" ) ); // remove vertex QgsGeometry polygonGeom4 = QgsGeometry::fromWkt( QStringLiteral( "Polygon((0.1 -0.1, 10.1 0, 9.9 10.1, 5 10, 0 10, 0.1 -0.1))" ) ); result = snapper.snapGeometry( polygonGeom4, 1 ); QCOMPARE( result.exportToWkt(), QStringLiteral( "Polygon ((0 0, 10 0, 10 10, 0 10, 0 0))" ) ); // snapping to unclosed linestring QgsGeometry polygonGeom5 = QgsGeometry::fromWkt( QStringLiteral( "Polygon((100.1 -0.1, 110.1 0, 109.9 10.1, 100 10, 100.1 -0.1))" ) ); result = snapper.snapGeometry( polygonGeom5, 1 ); QCOMPARE( result.exportToWkt(), QStringLiteral( "Polygon ((100 0, 110 0, 110 10, 100 10, 100 0))" ) ); QgsGeometry polygonGeom6 = QgsGeometry::fromWkt( QStringLiteral( "Polygon((100.1 -0.1, 110.1 0, 100 10, 100.1 -0.1))" ) ); result = snapper.snapGeometry( polygonGeom6, 1 ); QCOMPARE( result.exportToWkt(), QStringLiteral( "Polygon ((100 0, 110 0, 100 10, 100 0))" ) ); // insert new vertex QgsGeometry polygonGeom7 = QgsGeometry::fromWkt( QStringLiteral( "Polygon((100.1 -0.1, 120.5 0.5, 120 10, 100 9.9, 100.1 -0.1))" ) ); result = snapper.snapGeometry( polygonGeom7, 1 ); QCOMPARE( result.exportToWkt(), QStringLiteral( "Polygon ((100 0, 110 0, 120.5 0.5, 120 10, 110 10, 100 10, 100 0))" ) ); // remove vertex QgsGeometry polygonGeom8 = QgsGeometry::fromWkt( QStringLiteral( "Polygon((100.1 -0.1, 110.1 0, 109.9 10.1, 105 10, 100 10, 100.1 -0.1))" ) ); result = snapper.snapGeometry( polygonGeom8, 1 ); QCOMPARE( result.exportToWkt(), QStringLiteral( "Polygon ((100 0, 110 0, 110 10, 100 10, 100 0))" ) ); }
void QgsMapToolOffsetCurve::canvasPressEvent( QMouseEvent* e ) { deleteRubberBandAndGeometry(); mGeometryModified = false; mForceCopy = false; if ( !mCanvas ) { return; } //get selected features or snap to nearest feature if no selection QgsVectorLayer* layer = currentVectorLayer(); if ( !layer ) { notifyNotVectorLayer(); return; } QgsMapRenderer* renderer = mCanvas->mapRenderer(); QgsSnapper snapper( renderer ); configureSnapper( snapper ); QList<QgsSnappingResult> snapResults; snapper.snapPoint( e->pos(), snapResults ); if ( snapResults.size() > 0 ) { QgsFeature fet; const QgsSnappingResult& snapResult = snapResults.at( 0 ); if ( snapResult.layer ) { mSourceLayerId = snapResult.layer->id(); QgsVectorLayer* vl = dynamic_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( mSourceLayerId ) ); if ( vl && vl->getFeatures( QgsFeatureRequest().setFilterFid( snapResult.snappedAtGeometry ) ).nextFeature( fet ) ) { mForceCopy = ( e->modifiers() & Qt::ControlModifier ); //no geometry modification if ctrl is pressed mOriginalGeometry = createOriginGeometry( vl, snapResult, fet ); mRubberBand = createRubberBand(); if ( mRubberBand ) { mRubberBand->setToGeometry( mOriginalGeometry, layer ); } mModifiedFeature = fet.id(); createDistanceItem(); } } } }
void object::test<2>() { GeomAutoPtr src(reader.read( "POLYGON ((0 0, 0 100, 100 100, 100 0, 0 0))" )); GeometrySnapper snapper( *(src.get()) ); GeomAutoPtr snap(reader.read( "MULTIPOINT ((0.0000001 50))" )); GeomAutoPtr expected(reader.read( "POLYGON ((0 0, 0.0000001 50, 0 100, 100 100, 100 0, 0 0))" )); GeomAutoPtr ret(snapper.snapTo( *(snap.get()), 0.000001 )); ensure( ret->equalsExact(expected.get(),0) ); }
void QgsMapCoordsDialog::maybeSetXY( const QgsPoint & xy, Qt::MouseButton button ) { // Only LeftButton should set point if ( Qt::LeftButton == button ) { QgsPoint mapCoordPoint = xy; if ( mQgisCanvas && mSnapToBackgroundLayerBox->isChecked() ) { const QgsMapToPixel* mtp = mQgisCanvas->getCoordinateTransform(); if ( mtp ) { QgsPoint canvasPos = mtp->transform( xy.x(), xy.y() ); QPoint snapStartPoint( canvasPos.x(), canvasPos.y() ); QgsMapCanvasSnapper snapper( mQgisCanvas ); QList<QgsSnappingResult> snapResults; if ( snapper.snapToBackgroundLayers( snapStartPoint, snapResults ) == 0 ) { if ( snapResults.size() > 0 ) { mapCoordPoint = snapResults.at( 0 ).snappedVertex; } } } } leXCoord->clear(); leYCoord->clear(); leXCoord->setText( qgsDoubleToString( mapCoordPoint.x() ) ); leYCoord->setText( qgsDoubleToString( mapCoordPoint.y() ) ); } parentWidget()->showNormal(); parentWidget()->activateWindow(); parentWidget()->raise(); mPointFromCanvasPushButton->setChecked( false ); buttonBox->button( QDialogButtonBox::Ok )->setFocus(); activateWindow(); raise(); }
void TestQgsGeometrySnapper::snapPointToPoint() { QgsVectorLayer* rl = new QgsVectorLayer( QStringLiteral( "Point" ), QStringLiteral( "x" ), QStringLiteral( "memory" ) ); QgsGeometry refGeom = QgsGeometry::fromWkt( QStringLiteral( "Point(0 0)" ) ); QgsFeature ff( 0 ); ff.setGeometry( refGeom ); QgsGeometry refGeom2 = QgsGeometry::fromWkt( QStringLiteral( "Point(1 0)" ) ); QgsFeature ff2( 2 ); ff2.setGeometry( refGeom2 ); QgsFeatureList flist; flist << ff << ff2; rl->dataProvider()->addFeatures( flist ); QgsGeometry pointGeom = QgsGeometry::fromWkt( QStringLiteral( "Point(0.1 -0.1)" ) ); QgsGeometrySnapper snapper( rl ); QgsGeometry result = snapper.snapGeometry( pointGeom, 1 ); QCOMPARE( result.exportToWkt(), QStringLiteral( "Point (0 0)" ) ); pointGeom = QgsGeometry::fromWkt( QStringLiteral( "Point(0.6 -0.1)" ) ); result = snapper.snapGeometry( pointGeom, 1 ); QCOMPARE( result.exportToWkt(), QStringLiteral( "Point (1 0)" ) ); }
void CurveEditInstance::snapto(float snap) { ControlPointSnapper snapper(snap); forEachSelected(snapper); }