Skip to content

Commit ee79753

Browse files
author
mhugent
committed
completed QgsGeometry::closestSegmentWithContext for all wkb types. Not tested yet
git-svn-id: http://svn.osgeo.org/qgis/trunk@5325 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 3fe7d62 commit ee79753

File tree

1 file changed

+79
-106
lines changed

1 file changed

+79
-106
lines changed

src/core/qgsgeometry.cpp

Lines changed: 79 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -830,14 +830,7 @@ bool QgsGeometry::vertexAt(double &x, double &y,
830830
QgsPoint QgsGeometry::closestVertexWithContext(QgsPoint& point,
831831
QgsGeometryVertexIndex& atVertex,
832832
double& sqrDist)
833-
// TODO
834833
{
835-
836-
#ifdef QGISDEBUG
837-
std::cout << "QgsGeometry::closestVertexWithContext: Entered"
838-
<< "." << std::endl;
839-
#endif
840-
841834
QgsPoint minDistPoint;
842835

843836
// Initialise some stuff
@@ -864,102 +857,8 @@ QgsPoint QgsGeometry::closestVertexWithContext(QgsPoint& point,
864857
}
865858
}
866859
atVertex.push_back(closestVertexIndex);
867-
#if 0
868-
switch (mGeos->getGeometryTypeId())
869-
{
870-
case geos::GEOS_POINT: // a point
871-
{
872-
atVertex.push_back(closestVertexIndex);
873-
874-
minDistPoint = QgsPoint(
875-
mGeos->getCoordinate()->x,
876-
mGeos->getCoordinate()->y
877-
);
878-
879-
break;
880-
} // case geos::GEOS_POINT
881-
882-
case geos::GEOS_LINESTRING: // a linestring
883-
{
884-
int numPoints = mGeos->getNumPoints();
885-
886-
geos::LineString* geosls = static_cast<geos::LineString*>(mGeos);
887-
const geos::CoordinateSequence* sequence = geosls->getCoordinatesRO();
888-
889-
// go through points
890-
for (int n = 0; n < numPoints; n++)
891-
{
892-
double testDist = point.sqrDist(
893-
sequence->getAt(n).x,
894-
sequence->getAt(n).y
895-
);
896-
897-
if (testDist < sqrDist)
898-
{
899-
closestVertexIndex = n;
900-
sqrDist = testDist;
901-
}
902-
}
903-
904-
atVertex.push_back(closestVertexIndex);
905-
906-
break;
907-
} // case geos::GEOS_LINESTRING
908-
909-
case geos::GEOS_LINEARRING: // a linear ring (linestring with 1st point == last point)
910-
{
911-
// TODO
912-
break;
913-
} // case geos::GEOS_LINEARRING
914-
915-
case geos::GEOS_POLYGON: // a polygon
916-
{
917-
geos::CoordinateSequence* sequence = mGeos->getCoordinates();
918-
if(sequence)
919-
{
920-
for(int i = 0; i < sequence->getSize(); ++i)
921-
{
922-
double testDist = point.sqrDist(sequence->getAt(i).x, sequence->getAt(i).y);
923-
if(testDist < sqrDist)
924-
{
925-
closestVertexIndex = i;
926-
sqrDist = testDist;
927-
}
928-
}
929-
}
930-
atVertex.push_back(closestVertexIndex);
931-
break;
932-
} // case geos::GEOS_POLYGON
933-
934-
case geos::GEOS_MULTIPOINT: // a collection of points
935-
{
936-
// TODO
937-
break;
938-
} // case geos::GEOS_MULTIPOINT
939-
940-
case geos::GEOS_MULTILINESTRING: // a collection of linestrings
941-
{
942-
// TODO
943-
break;
944-
} // case geos::GEOS_MULTILINESTRING
945-
946-
case geos::GEOS_MULTIPOLYGON: // a collection of polygons
947-
{
948-
// TODO
949-
break;
950-
} // case geos::GEOS_MULTIPOLYGON
951-
952-
case geos::GEOS_GEOMETRYCOLLECTION: // a collection of heterogeneus geometries
953-
{
954-
// TODO
955-
break;
956-
} // case geos::GEOS_GEOMETRYCOLLECTION
957-
}
958-
#endif
959860
} // if (mGeos)
960-
961861
return minDistPoint;
962-
963862
}
964863

965864

@@ -973,7 +872,7 @@ QgsPoint QgsGeometry::closestSegmentWithContext(QgsPoint& point,
973872
double *thisx,*thisy;
974873
double *prevx,*prevy;
975874
double testdist;
976-
int closestSegmentIndex;
875+
int closestSegmentIndex = 0;
977876

978877
// Initialise some stuff
979878
beforeVertex.clear();
@@ -991,14 +890,14 @@ QgsPoint QgsGeometry::closestSegmentWithContext(QgsPoint& point,
991890
switch (wkbType)
992891
{
993892
case QGis::WKBPoint:
893+
case QGis::WKBMultiPoint:
994894
{
995895
// Points have no lines
996896
return QgsPoint(0,0);
997897
}
998898
case QGis::WKBLineString:
999899
{
1000-
closestSegmentIndex = 0;
1001-
unsigned char* ptr = mGeometry + 5;
900+
unsigned char* ptr = mGeometry+1+sizeof(int);
1002901
int* npoints = (int*) ptr;
1003902
ptr += sizeof(int);
1004903
for (int index=0; index < *npoints; ++index)
@@ -1025,11 +924,45 @@ QgsPoint QgsGeometry::closestSegmentWithContext(QgsPoint& point,
1025924
beforeVertex.push_back(closestSegmentIndex);
1026925
break;
1027926
}
927+
case QGis::WKBMultiLineString:
928+
{
929+
unsigned char* ptr = mGeometry+1+sizeof(int);
930+
int* nLines = (int*)ptr;
931+
ptr += sizeof(int);
932+
int* nPoints = 0; //number of points in a line
933+
int pointindex = 0;//global pointindex
934+
for(int linenr = 0; linenr < *nLines; ++linenr)
935+
{
936+
nPoints = (int*)ptr;
937+
ptr += sizeof(int);
938+
prevx = 0;
939+
prevy = 0;
940+
for(int pointnr = 0; pointnr < *nPoints; ++pointnr)
941+
{
942+
thisx = (double*) ptr;
943+
ptr += sizeof(double);
944+
thisy = (double*) ptr;
945+
ptr += sizeof(double);
946+
if(prevx && prevy)
947+
{
948+
if((testdist = distanceSquaredPointToSegment(point, prevx, prevy, thisx, thisy, minDistPoint)) < sqrDist )
949+
{
950+
closestSegmentIndex = pointindex;
951+
sqrDist = testdist;
952+
}
953+
}
954+
prevx = thisx;
955+
prevy = thisy;
956+
++pointindex;
957+
}
958+
}
959+
beforeVertex.push_back(closestSegmentIndex);
960+
break;
961+
}
1028962
case QGis::WKBPolygon:
1029963
{
1030-
closestSegmentIndex = 0;
1031964
int index = 0;
1032-
unsigned char* ptr = mGeometry + 5;
965+
unsigned char* ptr = mGeometry+1+sizeof(int);
1033966
int* nrings = (int*)ptr;
1034967
int* npoints = 0; //number of points in a ring
1035968
ptr += sizeof(int);
@@ -1061,6 +994,46 @@ QgsPoint QgsGeometry::closestSegmentWithContext(QgsPoint& point,
1061994
beforeVertex.push_back(closestSegmentIndex);
1062995
break;
1063996
}
997+
case QGis::WKBMultiPolygon:
998+
{
999+
unsigned char* ptr = mGeometry+1+sizeof(int);
1000+
int* nRings = 0;
1001+
int* nPoints = 0;
1002+
int pointindex = 0;
1003+
int* nPolygons = (int*)ptr;
1004+
ptr += sizeof(int);
1005+
for(int polynr = 0; polynr < *nPolygons; ++polynr)
1006+
{
1007+
nRings = (int*)ptr;
1008+
ptr += sizeof(int);
1009+
for(int ringnr = 0; ringnr < *nRings; ++ringnr)
1010+
{
1011+
nPoints = (int*)ptr;
1012+
prevx = 0;
1013+
prevy = 0;
1014+
for(int pointnr = 0; pointnr < *nPoints; ++pointnr)
1015+
{
1016+
thisx = (double*)ptr;
1017+
ptr += sizeof(double);
1018+
thisy = (double*)ptr;
1019+
ptr += sizeof(double);
1020+
if(prevx && prevy)
1021+
{
1022+
if((testdist = distanceSquaredPointToSegment(point, prevx, prevy, thisx, thisy, minDistPoint)) < sqrDist )
1023+
{
1024+
closestSegmentIndex = pointindex;
1025+
sqrDist = testdist;
1026+
}
1027+
}
1028+
prevx = thisx;
1029+
prevy = thisy;
1030+
++pointindex;
1031+
}
1032+
}
1033+
}
1034+
beforeVertex.push_back(closestSegmentIndex);
1035+
break;
1036+
}
10641037
} // switch (wkbType)
10651038

10661039
} // if (mGeometry)

0 commit comments

Comments
 (0)