@@ -341,6 +341,7 @@ void QgsMssqlProvider::loadFields()
341
341
{
342
342
mGeometryColName = mQuery .value ( 3 ).toString ();
343
343
mGeometryColType = sqlTypeName;
344
+ parser.IsGeography = sqlTypeName == " geography" ;
344
345
}
345
346
else
346
347
{
@@ -565,8 +566,20 @@ void QgsMssqlProvider::select( QgsAttributeList fetchAttributes,
565
566
// set spatial filter
566
567
if ( !rect.isEmpty () )
567
568
{
569
+ // polygons should be CCW for SqlGeography
570
+ QString r;
571
+ QTextStream foo ( &r );
572
+
573
+ foo.setRealNumberPrecision ( 8 );
574
+ foo.setRealNumberNotation ( QTextStream::FixedNotation );
575
+ foo << rect.xMinimum () << " " << rect.yMinimum () << " , "
576
+ << rect.xMaximum () << " " << rect.yMinimum () << " , "
577
+ << rect.xMaximum () << " " << rect.yMaximum () << " , "
578
+ << rect.xMinimum () << " " << rect.yMaximum () << " , "
579
+ << rect.xMinimum () << " " << rect.yMinimum ();
580
+
568
581
mStatement += QString ( " where [%1].STIntersects([%2]::STGeomFromText('POLYGON((%3))',%4)) = 1" ).arg (
569
- mGeometryColName , mGeometryColType , rect. asPolygon () , QString::number ( mSRId ) );
582
+ mGeometryColName , mGeometryColType , r , QString::number ( mSRId ) );
570
583
}
571
584
mFetchGeom = fetchGeometry;
572
585
mAttributesToFetch = fetchAttributes;
@@ -593,13 +606,23 @@ void QgsMssqlProvider::UpdateStatistics( bool estimate )
593
606
mNumberFeatures = 0 ;
594
607
// get features to calculate the statistics
595
608
QString statement;
609
+ bool readAll = false ;
596
610
if ( estimate )
597
611
{
598
- statement = QString ( " select min([%1].STPointN(1).STX), min([%1].STPointN(1).STY), max([%1].STPointN(1).STX), max([%1].STPointN(1).STY), COUNT([%1])" ).arg ( mGeometryColName );
612
+ if ( mGeometryColType == " geometry" )
613
+ statement = QString ( " select min([%1].STPointN(1).STX), min([%1].STPointN(1).STY), max([%1].STPointN(1).STX), max([%1].STPointN(1).STY), COUNT([%1])" ).arg ( mGeometryColName );
614
+ else
615
+ statement = QString ( " select min([%1].STPointN(1).Long), min([%1].STPointN(1).Lat), max([%1].STPointN(1).Long), max([%1].STPointN(1).Lat), COUNT([%1])" ).arg ( mGeometryColName );
599
616
}
600
617
else
601
618
{
602
- statement = QString ( " select min([%1].STEnvelope().STPointN(1).STX), min([%1].STEnvelope().STPointN(1).STY), max([%1].STEnvelope().STPointN(2).STX), max([%1].STEnvelope().STPointN(2).STY), count([%1])" ).arg ( mGeometryColName );
619
+ if ( mGeometryColType == " geometry" )
620
+ statement = QString ( " select min([%1].STEnvelope().STPointN(1).STX), min([%1].STEnvelope().STPointN(1).STY), max([%1].STEnvelope().STPointN(3).STX), max([%1].STEnvelope().STPointN(3).STY), count([%1])" ).arg ( mGeometryColName );
621
+ else
622
+ {
623
+ statement = QString ( " select [%1]" ).arg ( mGeometryColName );
624
+ readAll = true ;
625
+ }
603
626
}
604
627
605
628
if ( mSchemaName .isEmpty () )
@@ -619,13 +642,49 @@ void QgsMssqlProvider::UpdateStatistics( bool estimate )
619
642
if ( mQuery .isActive () )
620
643
{
621
644
QgsGeometry geom;
622
- if ( mQuery . next () )
645
+ if ( !readAll )
623
646
{
624
- mExtent .setXMinimum ( mQuery .value ( 0 ).toDouble () );
625
- mExtent .setYMinimum ( mQuery .value ( 1 ).toDouble () );
626
- mExtent .setXMaximum ( mQuery .value ( 2 ).toDouble () );
627
- mExtent .setYMaximum ( mQuery .value ( 3 ).toDouble () );
628
- mNumberFeatures = mQuery .value ( 4 ).toInt ();
647
+ if ( mQuery .next () )
648
+ {
649
+ mExtent .setXMinimum ( mQuery .value ( 0 ).toDouble () );
650
+ mExtent .setYMinimum ( mQuery .value ( 1 ).toDouble () );
651
+ mExtent .setXMaximum ( mQuery .value ( 2 ).toDouble () );
652
+ mExtent .setYMaximum ( mQuery .value ( 3 ).toDouble () );
653
+ mNumberFeatures = mQuery .value ( 4 ).toInt ();
654
+ }
655
+ }
656
+ else
657
+ {
658
+ // read all features
659
+ while ( mQuery .next () )
660
+ {
661
+ QByteArray ar = mQuery .value ( 0 ).toByteArray ();
662
+ unsigned char * wkb = parser.ParseSqlGeometry (( unsigned char * )ar.data (), ar.size () );
663
+ if ( wkb )
664
+ {
665
+ geom.fromWkb ( wkb, parser.GetWkbLen () );
666
+ QgsRectangle rect = geom.boundingBox ();
667
+
668
+ if ( mNumberFeatures > 0 )
669
+ {
670
+ if ( rect.xMinimum () < mExtent .xMinimum () )
671
+ mExtent .setXMinimum ( rect.xMinimum () );
672
+ if ( rect.yMinimum () < mExtent .yMinimum () )
673
+ mExtent .setYMinimum ( rect.yMinimum () );
674
+ if ( rect.xMaximum () > mExtent .xMaximum () )
675
+ mExtent .setXMaximum ( rect.xMaximum () );
676
+ if ( rect.yMaximum () > mExtent .yMaximum () )
677
+ mExtent .setYMaximum ( rect.yMaximum () );
678
+ }
679
+ else
680
+ {
681
+ mExtent = rect;
682
+ mWkbType = geom.wkbType ();
683
+ mSRId = parser.GetSRSId ();
684
+ }
685
+ ++mNumberFeatures ;
686
+ }
687
+ }
629
688
}
630
689
}
631
690
}
@@ -761,7 +820,12 @@ bool QgsMssqlProvider::addFeatures( QgsFeatureList & flist )
761
820
QString msg = mQuery .lastError ().text ();
762
821
QgsDebugMsg ( msg );
763
822
if ( !mSkipFailures )
823
+ {
824
+ QString msg = mQuery .lastError ().text ();
825
+ QgsDebugMsg ( msg );
826
+ pushError ( msg );
764
827
return false ;
828
+ }
765
829
else
766
830
continue ;
767
831
}
@@ -826,7 +890,10 @@ bool QgsMssqlProvider::addFeatures( QgsFeatureList & flist )
826
890
QString msg = mQuery .lastError ().text ();
827
891
QgsDebugMsg ( msg );
828
892
if ( !mSkipFailures )
893
+ {
894
+ pushError ( msg );
829
895
return false ;
896
+ }
830
897
}
831
898
}
832
899
0 commit comments