@@ -771,106 +771,117 @@ bool QgsGeometry::vertexAt(double &x, double &y,
771771 << " ." << std::endl;
772772#endif
773773
774- if (mGeometry )
775- {
776- int wkbType;
774+ if (mGeos )// try to find the vertex from the Geos geometry (it present)
775+ {
776+ geos::CoordinateSequence* cs = mGeos ->getCoordinates ();
777+ if (cs)
778+ {
779+ const geos::Coordinate& coord = cs->getAt (atVertex.back ());
780+ x = coord.x ;
781+ y = coord.y ;
782+ delete cs;
783+ return true ;
784+ }
785+ }
777786
778- memcpy (&wkbType, (mGeometry +1 ), sizeof (int ));
779- switch (wkbType)
780- {
787+ else if (mGeometry )
788+ {
789+ int wkbType;
790+
791+ memcpy (&wkbType, (mGeometry +1 ), sizeof (int ));
792+ switch (wkbType)
793+ {
781794 case QGis::WKBPoint:
782- {
795+ {
783796 // TODO
784797 return FALSE ;
785798 break ;
786- }
799+ }
787800 case QGis::WKBLineString:
788- {
801+ {
789802 unsigned char *ptr;
790803 int *nPoints;
791-
804+
792805 // get number of points in the line
793806 ptr = mGeometry + 5 ; // now at mGeometry.numPoints
794807 nPoints = (int *) ptr;
795-
808+
796809#ifdef QGISDEBUG
797- std::cout << " QgsGeometry::vertexAt: Number of points in WKBLineString is " << *nPoints
798- << " ." << std::endl;
810+ std::cout << " QgsGeometry::vertexAt: Number of points in WKBLineString is " << *nPoints
811+ << " ." << std::endl;
799812#endif
800813 // return error if underflow
801814 if (0 > atVertex.back ())
802- {
803- return FALSE ;
804- }
815+ {
816+ return FALSE ;
817+ }
805818 // return error if overflow
806819 if (*nPoints <= atVertex.back ())
807- {
808- return FALSE ;
809- }
810-
820+ {
821+ return FALSE ;
822+ }
823+
811824 // copy the vertex coordinates
812825 ptr = mGeometry + 9 + (atVertex.back () * 16 );
813826 memcpy (&x, ptr, 8 );
814827 ptr += 8 ;
815828 memcpy (&y, ptr, 8 );
816-
829+
817830#ifdef QGISDEBUG
818- std::cout << " QgsGeometry::vertexAt: Point is (" << x << " , " << y << " )"
819- << " ." << std::endl;
831+ std::cout << " QgsGeometry::vertexAt: Point is (" << x << " , " << y << " )"
832+ << " ." << std::endl;
820833#endif
821-
834+
822835 break ;
823- }
836+ }
824837 case QGis::WKBPolygon:
825- {
838+ {
826839 // TODO
827840 return false ;
828841 break ;
829- }
842+ }
830843 case QGis::WKBMultiPoint:
831- {
844+ {
832845 // TODO
833846 return false ;
834847 break ;
835- }
836-
848+ }
849+
837850 case QGis::WKBMultiLineString:
838- {
851+ {
839852 // TODO
840853 return false ;
841854 break ;
842- }
843-
855+ }
856+
844857 case QGis::WKBMultiPolygon:
845- {
846- // TODO
858+ {
859+ // TODO
847860 return false ;
848861 break ;
849- }
862+ }
850863 default :
851864#ifdef QGISDEBUG
852- qWarning (" error: mGeometry type not recognized in QgsGeometry::vertexAt" );
865+ qWarning (" error: mGeometry type not recognized in QgsGeometry::vertexAt" );
853866#endif
854- return false ;
855- break ;
856- }
857-
867+ return false ;
868+ break ;
869+ }
870+
858871#ifdef QGISDEBUG
859- std::cout << " QgsGeometry::vertexAt: Exiting TRUE." << std::endl;
872+ std::cout << " QgsGeometry::vertexAt: Exiting TRUE." << std::endl;
860873#endif
861-
862- return true ;
863-
864- }
865- else
866- {
874+
875+ return true ;
876+
877+ }
878+ else
879+ {
867880#ifdef QGISDEBUG
868- qWarning (" error: no mGeometry pointer in QgsGeometry::vertexAt" );
881+ qWarning (" error: no mGeometry pointer in QgsGeometry::vertexAt" );
869882#endif
870- return false ;
871- }
872-
873-
883+ return false ;
884+ }
874885}
875886
876887
0 commit comments