00001
00074 #ifndef INC_MI32_WATERMDL_H
00075 #define INC_MI32_WATERMDL_H
00076
00077 #ifndef INC_RVC_DBTABLE_H
00078 #include <rvc/dbtable.h>
00079 #endif
00080
00081 #ifndef INC_RVC_RASTER_H
00082 #include <rvc/raster.h>
00083 #endif
00084
00085 #ifndef INC_RVC_NULLMASK_H
00086 #include <rvc/nullmask.h>
00087 #endif
00088
00089 #ifndef INC_RVC_ARRAY_H
00090 #include <rvc/array.h>
00091 #endif
00092
00093 #ifndef INC_RVC_VECTOR_H
00094 #include <rvc/vector.h>
00095 #endif
00096
00097 #ifndef INC_MI32_MICACHE_H
00098 #include <mi32/micache.h>
00099 #endif
00100
00101 #include <map>
00102
00103
00104 #ifndef GENERATING_DOXYGEN_OUTPUT
00105 template <typename _TT> class ARRAYCACHE : public MICACHEIO {
00106 public:
00107 ARRAYCACHE () {}
00108 virtual ~ARRAYCACHE () {}
00109
00110 ERRVALUE Init (
00111 const INT32 NumCache,
00112 RVC::ARRAY* Array
00113 ) {
00114 ERRVALUE err = m_Cache.Create(NumCache, sizeof(_TT), *this);
00115 if (err < 0) return err;
00116 m_Array = Array;
00117 return 0;
00118 }
00119
00120 ERRVALUE Select (
00121 const INT32 itemid,
00122 MICACHE::ITEMINFO& iteminfo
00123 ) { return (m_Cache.Select(itemid, iteminfo, MICACHE::SELECTFLAG_None, m_Array)); }
00124
00125 ERRVALUE Read (
00126 const INT32 itemid,
00127 _TT& item
00128 ) { return (m_Cache.Read(itemid, 0, sizeof(_TT), &item, m_Array)); }
00129
00130
00131 void Clear (
00132 ) {
00133 m_Cache.Flush();
00134 m_Cache.Free();
00135 m_Array = 0;
00136 return;
00137 }
00138
00139 private:
00140
00141 SIMPLE_ARRAY<_TT> m_Buffer;
00142
00143 RVC::ARRAY* m_Array;
00144 MICACHE m_Cache;
00145
00146 ERRVALUE CacheLoad (
00147 MICACHE::ITEMINFO &iteminfo
00148 ) {
00149 RVC::ARRAY* Array = (RVC::ARRAY*)iteminfo.GetUserDataPtr();
00150 return Array->Read(iteminfo.GetItemID(), iteminfo.GetMemPtr());
00151 }
00152
00153 ERRVALUE CacheSave (
00154 MICACHE::ITEMINFO& iteminfo
00155 ) {
00156 RVC::ARRAY* Array = (RVC::ARRAY*)iteminfo.GetUserDataPtr();
00157 return Array->Write(iteminfo.GetItemID(), iteminfo.GetMemPtr());
00158 }
00159
00160 };
00161
00162 #endif // GENERATING_DOXYGEN_OUTPUT
00163
00164
00165
00201
00202 class WATERSHED {
00203
00204 public:
00205
00206
00207
00208 enum STATUS {
00209 STATUS_NotInitialized = -1,
00210 STATUS_Initial = 0,
00211 STATUS_HasDepressions = 1,
00212 STATUS_DepressionsFilled = 2
00213 };
00214
00215 enum FLAGS {
00216 FLAGS_None = 0x0000,
00217 FLAGS_FillDepressions = 0x0001,
00218 FLAGS_FillUpperDepressions = 0x0002,
00219
00220 FLAGS_FillLowerDepressions = 0x0004,
00221
00222 FLAGS_FillDoubleDepressions = 0x0008,
00223
00224 FLAGS_FillDepressionsMask = 0x000F,
00225 FLAGS_FlowPath = 0x0010,
00226 FLAGS_Basin = 0x0020,
00227 FLAGS_Ridge = 0x0040,
00228 FLAGS_CatchmentArea = 0x0100,
00229 FLAGS_TopographicIndex = 0x0200,
00230 FLAGS_MaximumUpFlow = 0x0400,
00231 FLAGS_DownFlow = 0x0800,
00232 FLAGS_BasinAttribute = 0x1000,
00233 FLAGS_WatershedAttribute = 0x2000,
00234 FLAGS_ObjectMask = 0x3F70
00235 };
00236
00237 enum DIRECTION {
00238 DIRECTION_Null = 0,
00239 DIRECTION_TopRight = 1,
00240 DIRECTION_Right = 2,
00241 DIRECTION_BottomRight = 3,
00242 DIRECTION_Bottom = 4,
00243 DIRECTION_BottomLeft = 5,
00244 DIRECTION_Left = 6,
00245 DIRECTION_TopLeft = 7,
00246 DIRECTION_Top = 8,
00247 DIRECTION_DepressionFlat = 12,
00248 DIRECTION_Minimum = 13,
00249 DIRECTION_Multiple = 14,
00250 DIRECTION_Flat = 15
00251 };
00252
00253 enum EXTREMA {
00254 EXTREMA_Null = 0,
00255 EXTREMA_Normal = 1,
00256 EXTREMA_Maximum = 2,
00257 EXTREMA_Minimum = 3,
00258 EXTREMA_Flat = 4,
00259 EXTREMA_FlatExit = 5,
00260 EXTREMA_FlatEntry = 6,
00261 EXTREMA_Saddle = 7
00262 };
00263
00264 enum OUTPUT {
00265 OUTPUT_None = -1,
00266 OUTPUT_First = 0,
00267 OUTPUT_RasterAdjusted = 0,
00268
00269 OUTPUT_RasterExtrema = 1,
00270 OUTPUT_RasterFlowDirection = 2,
00271 OUTPUT_RasterAccumulation = 3,
00272
00273 OUTPUT_RasterWatershed = 4,
00274
00275
00276 OUTPUT_RasterCatchmentArea = 5,
00277 OUTPUT_RasterTopographicIndex = 6,
00278 OUTPUT_RasterMaximumUpFlow = 7,
00279 OUTPUT_RasterDownFlow = 8,
00280 OUTPUT_VectorWatershed = 9,
00281
00282 OUTPUT_VectorFlowPath = 10,
00283
00284 OUTPUT_VectorBasin = 11,
00285
00286 OUTPUT_VectorRidge = 12,
00287 OUTPUT_VectorUserFlowPath = 13,
00288
00289 OUTPUT_VectorUserBasin = 14,
00290
00291 OUTPUT_VectorSegmentedFlowPath = 15,
00292 OUTPUT_Count = 16
00293 };
00294
00295 enum SEGMENTATIONPARAMETER {
00296 SEGMENTATIONPARAMETER_None = 0,
00297 SEGMENTATIONPARAMETER_FlowAccumulation = 1,
00298 SEGMENTATIONPARAMETER_Elevation = 2
00299 };
00300
00301 enum SEGMENTATIONINTERVAL {
00302 SEGMENTATIONINTERVAL_Equal = 0,
00303 SEGMENTATIONINTERVAL_Unequal = 1,
00304 SEGMENTATIONINTERVAL_Exponential = 2
00305 };
00306
00307 class ATTRIBUTE;
00308
00309
00311 class POURCANDIDATE {
00312
00313 public:
00314
00315
00316
00317
00318 POURCANDIDATE (
00319 ) {
00320 }
00321
00322 POURCANDIDATE (
00323 const DPOINT3D& Point,
00324 const INT32 LeftWatershed,
00325 const INT32 RightWatershed
00326 ) :
00327 m_Record(Point, LeftWatershed, RightWatershed)
00328 {
00329 }
00330
00331 POURCANDIDATE (
00332 const POURCANDIDATE &rhs
00333 ) :
00334 m_Record(rhs.m_Record)
00335 {
00336 }
00337
00338 ~POURCANDIDATE (
00339 ) {
00340 }
00341
00342
00343
00344 POURCANDIDATE& operator= (
00345 const POURCANDIDATE& rhs
00346 ) {
00347 if (this != &rhs) {
00348 m_Record = rhs.m_Record;
00349 }
00350 return (*this);
00351 }
00352
00353 void Init (
00354 const DPOINT3D& Point,
00355 const INT32 LeftWatershed,
00356 const INT32 RightWatershed
00357 ) {
00358 m_Record.m_Point = Point;
00359 m_Record.m_LeftWatershed = LeftWatershed;
00360 m_Record.m_RightWatershed = RightWatershed;
00361 return;
00362 }
00363
00364
00365
00369 const INT32 GetLeftWatershed (
00370 ) const {
00371 return m_Record.m_LeftWatershed;
00372 }
00373
00377 const INT32 GetRightWatershed (
00378 ) const {
00379 return m_Record.m_RightWatershed;
00380 }
00381
00385 const DPOINT3D& GetPoint (
00386 ) const {
00387 return m_Record.m_Point;
00388 }
00389
00390 private:
00391
00392 friend class WATERSHED::ATTRIBUTE;
00393
00394 struct RECORD {
00395
00396 DPOINT3D m_Point;
00397 INT32 m_LeftWatershed;
00398 INT32 m_RightWatershed;
00399
00400 RECORD (
00401 ) :
00402 m_Point(),
00403 m_LeftWatershed(-1),
00404 m_RightWatershed(-1)
00405 {
00406 };
00407
00408 RECORD (
00409 const DPOINT3D& Point,
00410 const INT32 LeftWatershed,
00411 const INT32 RightWatershed
00412 ) :
00413 m_Point(Point),
00414 m_LeftWatershed(LeftWatershed),
00415 m_RightWatershed(RightWatershed)
00416 {
00417 };
00418
00419 };
00420
00421
00422 RECORD m_Record;
00423
00424 };
00425
00429 class POUR {
00430
00431 public:
00432
00433
00434
00435 enum TYPE {
00436 TYPE_None = 0,
00437 TYPE_Single = 1,
00438 TYPE_Double = 2
00439 };
00440
00441
00442
00443
00444
00445
00446 POUR (
00447 ) {
00448 }
00449
00450 POUR (
00451 const TYPE type,
00452 const POURCANDIDATE& pourcandidate,
00453 const INT32 id
00454 ) :
00455 m_Record(type, pourcandidate, id)
00456 {
00457 }
00458
00459 POUR (
00460 const POUR &rhs
00461 ) :
00462 m_Record(rhs.m_Record)
00463 {
00464 }
00465
00466 ~POUR (
00467 ) {
00468 }
00469
00470
00471
00472 POUR& operator= (
00473 const POUR& rhs
00474 ) {
00475 if (this != &rhs) {
00476 m_Record = rhs.m_Record;
00477 }
00478 return (*this);
00479 }
00480
00481 void Init (
00482 const TYPE type,
00483 const POURCANDIDATE& pourcandidate,
00484 const INT32 id
00485 ) {
00486 m_Record.m_Type = type;
00487 m_Record.m_Point = pourcandidate.GetPoint();
00488 m_Record.m_LeftWatershed = pourcandidate.GetLeftWatershed();
00489 m_Record.m_RightWatershed = pourcandidate.GetRightWatershed();
00490 m_Record.m_ElementIDOfVectorPoint = id;
00491 }
00492
00493
00494
00498 const INT32 GetLeftWatershed (
00499 ) const {
00500 return m_Record.m_LeftWatershed;
00501 }
00502
00506 const INT32 GetRightWatershed (
00507 ) const {
00508 return m_Record.m_RightWatershed;
00509 }
00510
00514 const DPOINT3D& GetPoint (
00515 ) const {
00516 return m_Record.m_Point;
00517 }
00518
00522 const TYPE GetType (
00523 ) const {
00524 return m_Record.m_Type;
00525 }
00526
00530 const INT32 GetElementIDOfVectorPoint (
00531 ) const {
00532 return m_Record.m_ElementIDOfVectorPoint;
00533 }
00534
00535 private:
00536
00537 friend class WATERSHED::ATTRIBUTE;
00538
00539 struct RECORD {
00540
00541 TYPE m_Type;
00542 DPOINT3D m_Point;
00543 INT32 m_LeftWatershed;
00544 INT32 m_RightWatershed;
00545 INT32 m_ElementIDOfVectorPoint;
00546
00547 RECORD (
00548 ) :
00549 m_Type(TYPE_None),
00550 m_Point(),
00551 m_LeftWatershed(-1),
00552 m_RightWatershed(-1),
00553 m_ElementIDOfVectorPoint(-1)
00554 {
00555 };
00556
00557 RECORD (
00558 const TYPE type,
00559 const POURCANDIDATE& pourcandidate,
00560 const INT32 id
00561 ) :
00562 m_Type(type),
00563 m_Point(pourcandidate.GetPoint()),
00564 m_LeftWatershed(pourcandidate.GetLeftWatershed()),
00565 m_RightWatershed(pourcandidate.GetRightWatershed()),
00566 m_ElementIDOfVectorPoint(id)
00567 {
00568 };
00569
00570 };
00571
00572
00573 RECORD m_Record;
00574
00575 };
00576
00577
00585 class POLYGON {
00586
00587 public:
00588
00589
00590
00591
00592
00593 POLYGON (
00594 ) {
00595 }
00596
00597 POLYGON (
00598 const POLYGON &rhs
00599 ) :
00600 m_Record(rhs.m_Record),
00601 m_VectorPolygons(rhs.m_VectorPolygons),
00602 m_UpperPours(rhs.m_UpperPours),
00603 m_LowerPours(rhs.m_LowerPours)
00604 {
00605 }
00606
00607 ~POLYGON (
00608 ) {
00609 m_VectorPolygons.Clear();
00610 m_UpperPours.Clear();
00611 m_LowerPours.Clear();
00612 }
00613
00614
00615
00616 POLYGON& operator= (
00617 const POLYGON& rhs
00618 ) {
00619 if (this != &rhs) {
00620 m_Record = rhs.m_Record;
00621 m_VectorPolygons = rhs.m_VectorPolygons;
00622 m_UpperPours = rhs.m_UpperPours;
00623 m_LowerPours = rhs.m_LowerPours;
00624 }
00625 return (*this);
00626 }
00627
00628
00629
00630
00634 const bool HasDepression (
00635 ) const {
00636 return (m_Record.m_Z > m_Record.m_MinZ);
00637 }
00638
00642 const double GetArea (
00643 ) const {
00644 return m_Record.m_Area;
00645 }
00646
00650 const double GetPerimeter (
00651 ) const {
00652 return m_Record.m_Perimeter;
00653 }
00654
00658 const double GetDepressionArea (
00659 ) const {
00660 return m_Record.m_DepressionArea;
00661 }
00662
00666 const double GetDepressionVolume (
00667 ) const {
00668 return m_Record.m_DepressionVolume;
00669 }
00670
00674 const double GetZ (
00675 ) const {
00676 return m_Record.m_Z;
00677 }
00678
00682 const double GetRawZ (
00683 ) const {
00684 return m_Record.m_RawZ;
00685 }
00686
00690 const double GetMinZ (
00691 ) const {
00692 return m_Record.m_MinZ;
00693 }
00694
00698 const double GetMaxZ (
00699 ) const {
00700 return m_Record.m_MaxZ;
00701 }
00702
00706 const INT32 GetNumberOfVectorPolygons (
00707 ) const {
00708 return m_VectorPolygons.GetNumItems();
00709 }
00710
00714 const INT32 GetIDOfVectorPolygon (
00715 const UINT32 index
00716 ) const {
00717 if (index < (UINT32)m_VectorPolygons.GetNumItems()) return m_VectorPolygons[(int)index];
00718 return -1;
00719 }
00720
00724 const UINT32 GetNumberOfLowerPours (
00725 ) const {
00726 return (m_LowerPours.GetNumItems());
00727 }
00728
00732 const INT32 GetIDOfLowerPour (
00733 const UINT32 index
00734 ) const {
00735 if (index < (UINT32)m_LowerPours.GetNumItems()) return m_LowerPours[(int)index];
00736 return -1;
00737 }
00738
00742 const INT32 GetNumberOfUpperPours (
00743 ) const {
00744 return (m_UpperPours.GetNumItems());
00745 }
00746
00750 const INT32 GetIDOfUpperPour (
00751 const UINT32 index
00752 ) const {
00753 if (index < (UINT32)m_UpperPours.GetNumItems()) return m_UpperPours[(int)index];
00754 return -1;
00755 }
00756
00757 private:
00758
00759 friend class WATERSHED::ATTRIBUTE;
00760
00761 struct RECORD {
00762 double m_DepressionArea;
00763 double m_DepressionVolume;
00764 double m_Area;
00765 double m_Perimeter;
00766 double m_MinZ;
00767 double m_Z;
00768 double m_RawZ;
00769 double m_MaxZ;
00770 INT32 m_NextVector;
00771 INT32 m_NextUpper;
00772 INT32 m_NextLower;
00773 INT32 m_Spare;
00774
00775 RECORD (
00776 ) :
00777 m_DepressionArea(0.0),
00778 m_DepressionVolume(0.0),
00779 m_Area(0.0),
00780 m_Perimeter(0.0),
00781 m_MinZ(DBL_MAX),
00782 m_Z(DBL_MAX),
00783 m_RawZ(DBL_MAX),
00784 m_MaxZ(-DBL_MAX),
00785 m_NextVector(-1),
00786 m_NextUpper(-1),
00787 m_NextLower(-1),
00788 m_Spare(0)
00789 {
00790 };
00791
00792 };
00793
00794 struct NEXTRECORD {
00795 INT32 m_ID;
00796 INT32 m_Next;
00797
00798 NEXTRECORD (
00799 ) :
00800 m_ID(-1),
00801 m_Next(-1)
00802 {
00803 };
00804 };
00805
00806
00807
00808 RECORD m_Record;
00809
00810 SIMPLE_ARRAY<INT32> m_VectorPolygons;
00811 SIMPLE_ARRAY<INT32> m_UpperPours;
00812 SIMPLE_ARRAY<INT32> m_LowerPours;
00813
00814 };
00815
00818 class ATTRIBUTE {
00819
00820 public:
00821
00822
00823
00824 ATTRIBUTE (
00825 const UINT32 NumberRasterPolygons
00826 );
00827
00828 ~ATTRIBUTE (
00829 );
00830
00832 ERRVALUE CheckInternalElevation (
00833 const INT32 watershed,
00834 const double elevation
00835 );
00836
00838 ERRVALUE CheckElevationAndAddArea (
00839 const INT32 watershed,
00840 const double elevation,
00841 const double area
00842 );
00843
00845 ERRVALUE CheckBoundaryElevation (
00846 const INT32 watershed,
00847 const double z,
00848 const double rawZ
00849 );
00850
00852 ERRVALUE Init (
00853 const INT32 NumPolys,
00854 const INT32 NumLines,
00855 const INT32 NumNodes
00856 );
00857
00859 ERRVALUE AddLink (
00860 const INT32 watershed,
00861 const INT32 VectorPolygon
00862 );
00863
00865 ERRVALUE AddArea (
00866 const INT32 watershed,
00867 const double area
00868 );
00869
00871 ERRVALUE AddDepressionArea (
00872 const INT32 watershed,
00873 const double area
00874 );
00875
00877 ERRVALUE AddDepressionVolume (
00878 const INT32 watershed,
00879 const double volume
00880 );
00881
00883 ERRVALUE AddDepressionData (
00884 const INT32 watershed,
00885 const double area,
00886 const double volume
00887 );
00888
00890 ERRVALUE AddPerimeter (
00891 const INT32 watershed,
00892 const double perimeter
00893 );
00894
00896 ERRVALUE AddVectorPolygon (
00897 const INT32 watershed,
00898 const INT32 VectorPolygon
00899 );
00900
00902 ERRVALUE AddLowerPour (
00903 const INT32 watershed,
00904 const INT32 LowerPour
00905 );
00906
00908 ERRVALUE AddUpperPour (
00909 const INT32 watershed,
00910 const INT32 UpperPour
00911 );
00912
00914 ERRVALUE AddPour (
00915 const POUR& pour
00916 );
00917
00919 ERRVALUE AddPourCandidate (
00920 const POURCANDIDATE& pourcandidate
00921 );
00922
00926 ERRVALUE DefinePours (
00927 RVC::VECTOR& vector
00928 );
00929
00931 void RisePourType (
00932 POUR::TYPE& type
00933 ) {
00934 switch (type) {
00935 case POUR::TYPE_None: type = POUR::TYPE_Single; break;
00936 case POUR::TYPE_Single: type = POUR::TYPE_Double; break;
00937 }
00938 return;
00939 }
00940
00944 ERRVALUE SaveAsVectorPoint (
00945 RVC::VECTOR& vector,
00946 const DPOINT3D& point,
00947 const INT32 id
00948 );
00949
00953 const bool HasDepressions (
00954 ) const {
00955 return (m_NumberOfDepressions > 0);
00956 };
00957
00961 const bool HasDepression (
00962 const INT32 watershed
00963 );
00964
00968 const double GetWatershedZ (
00969 const INT32 watershed
00970 );
00971
00975 const INT32 GetNumberOfWatershedPolygonsWithDepression (
00976 ) const {
00977 return m_NumberOfDepressions;
00978 }
00979
00983 const INT32 GetNumberOfWatershedPolygons (
00984 ) const {
00985 return m_PolygonArray.GetNumItems();
00986 };
00987
00991 bool GetWatershedPolygon (
00992 const INT32 index,
00993 POLYGON& polygon
00994 );
00995
00999 const INT32 GetNumberOfVectorPolygons (
01000 ) const {
01001 return m_VectorArray.GetNumItems();
01002 };
01003
01008 const INT32 GetIDOfWatershedPolygonForVectorPolygon (
01009 const INT32 index
01010 );
01011
01015 const INT32 GetNumberOfPours (
01016 ) const {
01017 return (m_PourArray.GetNumItems());
01018 };
01019
01023 bool GetPour (
01024 const INT32 index,
01025 POUR& pour
01026 );
01027
01031 const INT32 GetNumberOfPourCandidates (
01032 ) const {
01033 return (m_PourCandidateArray.GetNumItems());
01034 };
01035
01039 bool GetPourCandidate (
01040 const INT32 index,
01041 POURCANDIDATE& pourcandidate
01042 );
01043
01047 const INT32 GetNumberOfDoublePours (
01048 ) const {
01049 return m_NumberOfDoublePours;
01050 }
01051
01052
01053 private:
01054 #ifndef GENERATING_DOXYGEN_OUTPUT
01055
01056 struct LINKRECORD {
01057 INT32 m_Watershed;
01058
01059 LINKRECORD (
01060 ) :
01061 m_Watershed(-1)
01062 {
01063 };
01064
01065 };
01066
01067
01068
01069
01070 INT32 m_NumberOfDepressions;
01071 INT32 m_NumberOfDoublePours;
01072
01073 RVC::OBJECT m_File;
01074
01075 RVC::ARRAY m_PourCandidateArray;
01076 RVC::ARRAY m_PourArray;
01077 RVC::ARRAY m_PolygonArray;
01078 RVC::ARRAY m_VectorArray;
01079 RVC::ARRAY m_UpperPourArray;
01080 RVC::ARRAY m_LowerPourArray;
01081 RVC::ARRAY m_LinkArray;
01082
01083 ARRAYCACHE<POURCANDIDATE::RECORD> m_PourCandidateCache;
01084 ARRAYCACHE<POUR::RECORD> m_PourCache;
01085 ARRAYCACHE<POLYGON::RECORD> m_PolygonCache;
01086 ARRAYCACHE<POLYGON::NEXTRECORD> m_VectorCache;
01087 ARRAYCACHE<POLYGON::NEXTRECORD> m_UpperPourCache;
01088 ARRAYCACHE<POLYGON::NEXTRECORD> m_LowerPourCache;
01089 ARRAYCACHE<LINKRECORD> m_LinkCache;
01090
01091 POURCANDIDATE::RECORD m_PourCandidateRecord;
01092 POUR::RECORD m_PourRecord;
01093 POLYGON::RECORD m_PolygonRecord;
01094 POLYGON::NEXTRECORD m_NextRecord;
01095 LINKRECORD m_LinkRecord;
01096
01097
01098
01099 ATTRIBUTE (
01100 );
01101
01102 ATTRIBUTE (
01103 const ATTRIBUTE &rhs
01104 );
01105
01106
01107
01108 ATTRIBUTE& operator= (
01109 const ATTRIBUTE& rhs
01110 );
01111
01112 ERRVALUE Make ();
01113 ERRVALUE Delete();
01114 ERRVALUE FillPolygonsTable(const UINT32 NumberOfRasterPolygons);
01115 ERRVALUE FillLinksTable(const UINT32 NumberOfVectorPolygons);
01116
01117 #endif // GENERATING_DOXYGEN_OUTPUT
01118
01119 };
01120
01121
01122
01123
01124
01125 static const UINT32 DefaultOutlet;
01126
01127
01128 static const UINT32 DefaultInlet;
01129
01130
01131 static const UINT32 DefaultBranch;
01132
01133
01134 static const UINT32 DefaultBasin;
01135
01136 static const bool DefaultValleySeparation;
01137
01138
01139 static const UINT32 MinimumOutlet;
01140 static const UINT32 MinimumInlet;
01141 static const UINT32 MinimumBranch;
01142 static const UINT32 MinimumBasin;
01143
01144
01145 static const UINT32 s_DefaultDepressionMaximumArea;
01146 static const UINT32 s_DefaultDepressionMaximumNullArea;
01147 static const double s_DefaultDepressionMaximumDepth;
01148 static const UINT32 s_DefaultDepressionMinimumDepthArea;
01149 static const bool s_DefaultPutNullCellAtUnfilledDepression;
01150
01151 static const UINT32 s_MinimumDepressionMaximumArea;
01152 static const UINT32 s_MinimumDepressionMaximumNullArea;
01153 static const double s_MinimumDepressionMaximumDepth;
01154 static const UINT32 s_MinimumDepressionMinimumDepthArea;
01155
01156 static const UINT32 s_MaximumDepressionMaximumArea;
01157 static const UINT32 s_MaximumDepressionMaximumNullArea;
01158 static const double s_MaximumDepressionMaximumDepth;
01159 static const UINT32 s_MaximumDepressionMinimumDepthArea;
01160
01161 static UINT32 GetDefaultInlet (
01162 WATERSHED *watershed
01163 ) {
01164 if (watershed == 0) return DefaultInlet;
01165 return watershed->GetDefaultInlet();
01166 }
01167
01168 static UINT32 GetDefaultOutlet (
01169 WATERSHED *watershed
01170 ) {
01171 if (watershed == 0) return DefaultOutlet;
01172 return watershed->GetDefaultOutlet();
01173 }
01174
01175 static UINT32 GetDefaultBasin (
01176 WATERSHED *watershed
01177 ) {
01178 if (watershed == 0) return DefaultBasin;
01179 return watershed->GetDefaultBasin();
01180 }
01181
01182 static UINT32 GetDefaultBranch (
01183 WATERSHED *watershed
01184 ) {
01185 if (watershed == 0) return DefaultBranch;
01186 return watershed->GetDefaultBranch();
01187 }
01188
01189
01190
01191 WATERSHED (
01192 const RVC::OBJITEM& objitem
01193 );
01194
01195 ~WATERSHED (
01196 );
01197
01198
01199
01200
01201
01205 ERRVALUE Compute (
01206 const FLAGS flags
01207 );
01208
01213 ERRVALUE FillDepressions (
01214 const SIMPLE_ARRAY<INT32> &depressions,
01215 const FLAGS flags
01216 );
01217
01222 ERRVALUE ComputeElements (
01223 const SIMPLE_ARRAY<LPOINT2D> &seeds,
01224 const FLAGS flags
01225 );
01226
01230 ERRVALUE ComputeFlowpathSegmentation (
01231 const SEGMENTATIONPARAMETER parameter,
01232 const SEGMENTATIONINTERVAL interval,
01233 const DOUBLE_ARRAY<double>& values
01234 );
01235
01240 ERRVALUE ComputeExtraRasters (
01241 const FLAGS flags
01242 );
01243
01247 bool GetObjItem (
01248 const OUTPUT id,
01249 RVC::OBJITEM& objitem
01250 ) const;
01251
01255 INT32 GetNumberOfObjects (
01256 ) const;
01257
01261 STATUS GetStatus (
01262 ) const {
01263 return m_Status;
01264 }
01265
01266
01270 ERRVALUE SetMask (
01271 const RVC::OBJITEM& objitem,
01272 const bool use
01273 );
01274
01275
01279 UINT32 GetBasin (
01280 ) const {
01281 return m_Basin;
01282 }
01283
01285 void SetBasin (
01286 const UINT32 basin
01287 ) {
01288 if (basin < MinimumBasin) m_Basin = MinimumBasin;
01289 else m_Basin = basin;
01290 return;
01291 }
01292
01296 UINT32 GetBranch (
01297 ) const {
01298 return m_Branch;
01299 }
01300
01302 void SetBranch (
01303 const UINT32 branch
01304 ) {
01305 if (branch < MinimumBranch) m_Branch = MinimumBranch;
01306 else m_Branch = branch;
01307 return;
01308 }
01309
01313 UINT32 GetOutlet (
01314 ) const {
01315 return m_Outlet;
01316 }
01317
01319 void SetOutlet (
01320 const UINT32 outlet
01321 ) {
01322 if (outlet < MinimumOutlet) m_Outlet = MinimumOutlet;
01323 else m_Outlet = outlet;
01324 return;
01325 }
01326
01330 UINT32 GetInlet (
01331 ) const {
01332 return m_Inlet;
01333 }
01334
01336 void SetInlet (
01337 const UINT32 inlet
01338 ) {
01339 if (inlet < MinimumInlet) m_Inlet = MinimumInlet;
01340 else m_Inlet = inlet;
01341 return;
01342 }
01343
01347 bool IsValleySeparated (
01348 ) const {
01349 return m_ValleySeparation;
01350 }
01351
01353 void SetValleySeparation (
01354 const bool separation
01355 ) {
01356 m_ValleySeparation = separation;
01357 return;
01358 }
01359
01363 UINT32 DepressionMaximumArea (
01364 ) const {
01365 return m_DepressionMaximumArea;
01366 }
01367
01369 void SetDepressionMaximumArea (
01370 const UINT32 area
01371 ) {
01372 m_DepressionMaximumArea = bound(area, s_MinimumDepressionMaximumArea, s_MaximumDepressionMaximumArea);
01373 return;
01374 }
01375
01379 UINT32 DepressionMaximumNullArea (
01380 ) const {
01381 return m_DepressionMaximumNullArea;
01382 }
01383
01385 void SetDepressionMaximumNullArea (
01386 const UINT32 area
01387 ) {
01388 m_DepressionMaximumNullArea = bound(area, s_MinimumDepressionMaximumNullArea, s_MaximumDepressionMaximumNullArea);
01389 return;
01390 }
01391
01395 double DepressionMaximumDepth (
01396 ) const {
01397 return m_DepressionMaximumDepth;
01398 }
01399
01401 void SetDepressionMaximumDepth (
01402 const double depth
01403 ) {
01404 m_DepressionMaximumDepth = bound(depth, s_MinimumDepressionMaximumDepth, s_MaximumDepressionMaximumDepth);
01405 return;
01406 }
01407
01411 UINT32 DepressionMinimumDepthArea (
01412 ) const {
01413 return m_DepressionMinimumDepthArea;
01414 }
01415
01417 void SetDepressionMinimumDepthArea (
01418 const UINT32 area
01419 ) {
01420 m_DepressionMinimumDepthArea = bound(area, s_MinimumDepressionMinimumDepthArea, s_MaximumDepressionMinimumDepthArea);
01421 return;
01422 }
01423
01427 bool GetPutNullCellAtUnfilledDepression (
01428 ) const {
01429 return m_PutNullCellAtUnfilledDepression;
01430 }
01431
01433 void SetPutNullCellAtUnfilledDepression (
01434 const bool value
01435 ) {
01436 m_PutNullCellAtUnfilledDepression = value;
01437 return;
01438 }
01439
01440
01444 const INT32 GetNumberOfWatershedPolygons (
01445 ) const {
01446 if (m_Attribute == 0) return 0;
01447 return (m_Attribute->GetNumberOfWatershedPolygons() - 1);
01448 };
01449
01453 bool GetWatershedPolygon (
01454 POLYGON &polygon,
01455 const INT32 index
01456 ) {
01457 if (m_Attribute == 0) return false;
01458 return m_Attribute->GetWatershedPolygon(index, polygon);
01459 }
01460
01464 const INT32 GetNumberOfWatershedPolygonsWithDepression (
01465 ) const {
01466 if (m_Attribute == 0) return 0;
01467 return m_Attribute->GetNumberOfWatershedPolygonsWithDepression();
01468 }
01469
01473 const INT32 GetNumberOfVectorPolygons (
01474 ) const {
01475 if (m_Attribute == 0) return 0;
01476 return (m_Attribute->GetNumberOfVectorPolygons());
01477 };
01478
01482 const INT32 GetIDOfWatershedPolygonAtPoint (
01483 const DPOINT2D &point
01484 );
01485
01490 const INT32 GetIDOfWatershedPolygonForVectorPolygon (
01491 const INT32 index
01492 ) const {
01493 if (m_Attribute == 0) return -1;
01494 return (m_Attribute->GetIDOfWatershedPolygonForVectorPolygon(index));
01495 };
01496
01500 const INT32 GetNumberOfPours (
01501 ) const {
01502 if (m_Attribute == 0) return 0;
01503 return (m_Attribute->GetNumberOfPours());
01504 };
01505
01509 bool GetPour (
01510 POUR &pour,
01511 const INT32 index
01512 ) {
01513 if (m_Attribute == 0) return false;
01514 return m_Attribute->GetPour(index, pour);
01515 }
01516
01520 const INT32 GetNumberOfDoublePours (
01521 ) const {
01522 if (m_Attribute == 0) return 0;
01523 return m_Attribute->GetNumberOfDoublePours();
01524 }
01525
01526 UINT32 GetDefaultInlet (
01527 ) {
01528 const double z = (double)MAX(m_NumColumns, m_NumLines) / 1024;
01529 return FAST_ROUND_POSITIVE(MinimumInlet * MAX(1.0, z));
01530 }
01531
01532 UINT32 GetDefaultOutlet (
01533 ) {
01534 const double z = (double)MAX(m_NumColumns, m_NumLines) / 1024;
01535 return FAST_ROUND_POSITIVE(MinimumOutlet * MAX(1.0, z));
01536 }
01537
01538 UINT32 GetDefaultBasin (
01539 ) {
01540 const double x = (double)m_NumColumns / 1024;
01541 const double y = (double)m_NumLines / 1024;
01542 return FAST_ROUND_POSITIVE(MinimumBasin * MAX(1.0, x * y));
01543 }
01544
01545 UINT32 GetDefaultBranch (
01546 ) {
01547 const double x = (double)m_NumColumns / 1024;
01548 const double y = (double)m_NumLines / 1024;
01549 return FAST_ROUND_POSITIVE(MinimumBranch * MAX(1.0, x * y));
01550 }
01551
01552 private:
01553 #ifndef GENERATING_DOXYGEN_OUTPUT
01554
01555
01556
01557 enum RASTERS {
01558 RASTER_First = 0,
01559 RASTER_Adjusted = 0,
01560 RASTER_Extrema = 1,
01561 RASTER_FlowDirection = 2,
01562 RASTER_Accumulation = 3,
01563 RASTER_Watershed = 4,
01564 RASTER_CatchmentArea = 5,
01565 RASTER_TopographicIndex = 6,
01566 RASTER_MaximumUpFlow = 7,
01567 RASTER_DownFlow = 8,
01568 RASTER_Temp = 9,
01569 RASTER_Bin = 10,
01570 RASTER_Count = 11
01571 };
01572
01573 enum VECTORS {
01574 VECTOR_First = 0,
01575 VECTOR_Watershed = 0,
01576 VECTOR_FlowPath = 1,
01577 VECTOR_Basin = 2,
01578 VECTOR_Ridge = 3,
01579 VECTOR_UserFlowPath = 4,
01580 VECTOR_UserBasin = 5,
01581 VECTOR_SegmentedFlowPath = 6,
01582 VECTOR_Count = 7
01583 };
01584
01585 struct STREAMORDER {
01586 INT32 m_Line;
01587 INT32 m_Parent;
01588 UINT32 m_Accumulation;
01589 INT32 m_Child;
01590 UINT32 m_ChildAccumulation;
01591 UINT8 m_NumChildren;
01592 INT32 m_ID;
01593 UINT16 m_Horton;
01594 UINT16 m_Strahler;
01595 UINT16 m_Shreve;
01596 UINT16 m_Scheidegger;
01597
01598 STREAMORDER (
01599 ) :
01600 m_Line(-1),
01601 m_Parent(-1),
01602 m_Accumulation(0),
01603 m_Child(-1),
01604 m_ChildAccumulation(0),
01605 m_NumChildren(0),
01606 m_ID(0),
01607 m_Horton(0),
01608 m_Strahler(0),
01609 m_Shreve(0),
01610 m_Scheidegger(0)
01611 {
01612 };
01613
01614 };
01615
01616 struct ORDERSTAT {
01617 double length;
01618 double area;
01619 INT32 number;
01620 };
01621
01622
01623
01624 typedef std::map<INT32, ORDERSTAT> ORDERSTATMAP;
01625
01626
01627
01628 const RVC::OBJITEM m_DEMObjItem;
01629 INT32 m_NumLines;
01630 INT32 m_NumColumns;
01631
01632 RVC::OBJECT m_RasterTempFiles[RASTER_Count];
01633 RVC::RASTER m_Rasters[RASTER_Count];
01634 RVC::OBJECT m_VectorTempFiles[VECTOR_Count];
01635 RVC::VECTOR m_Vectors[VECTOR_Count];
01636 RVC::OBJITEM m_ObjItems[OUTPUT_Count];
01637 ATTRIBUTE *m_Attribute;
01638 STATUS m_Status;
01639 UINT32 m_Outlet;
01640 UINT32 m_Inlet;
01641 UINT32 m_Branch;
01642 UINT32 m_Basin;
01643 bool m_ValleySeparation;
01644 UINT32 m_DepressionMaximumArea;
01645 UINT32 m_DepressionMaximumNullArea;
01646 double m_DepressionMaximumDepth;
01647 UINT32 m_DepressionMinimumDepthArea;
01648 bool m_PutNullCellAtUnfilledDepression;
01649
01650 bool m_UseMask;
01651 RVC::OBJITEM m_MaskObjItem;
01652 SIMPLE_ARRAY<UINT8> m_NullBuffer;
01653
01654 FLAGS m_Flags;
01655
01656
01657
01658
01659 WATERSHED (
01660 );
01661
01662 WATERSHED (
01663 const WATERSHED &rhs
01664 );
01665
01666
01667
01668 WATERSHED& operator= (
01669 const WATERSHED& rhs
01670 );
01671
01672
01673
01674
01675 ERRVALUE CheckNeededSpace ();
01676 ERRVALUE CopyMaskAsNull ();
01677
01678 ERRVALUE MakeAdjustedElevation (RVC::RASTER& dem);
01679 ERRVALUE MakeFlowDirection (RVC::RASTER& dem);
01680 ERRVALUE MakeAccumulation (RVC::RASTER& dem);
01681 ERRVALUE MakeExtrema (RVC::RASTER& dem);
01682 ERRVALUE MakeWatershedRaster (RVC::RASTER& dem);
01683 ERRVALUE MakeTemp (RVC::RASTER& dem);
01684 ERRVALUE MakeBin (RVC::RASTER& dem);
01685 ERRVALUE MakeCatchmentArea (RVC::RASTER& dem);
01686 ERRVALUE MakeTopographicIndex (RVC::RASTER& dem);
01687 ERRVALUE MakeMaximumUpFlow (RVC::RASTER& dem);
01688 ERRVALUE MakeDownFlow (RVC::RASTER& dem);
01689
01690 ERRVALUE MakeVector (
01691 RVC::RASTER& dem,
01692 const RVC::DESCRIPTOR& descriptor,
01693 const WATERSHED::VECTORS id,
01694 const RVC::VECTOR::POINTTYPE PointType,
01695 const RVC::VECTOR::TOPOLOGYTYPE TopologyType
01696 );
01697
01698 ERRVALUE ComputeAccumulation ();
01699 ERRVALUE ComputeAttribute ();
01700 ERRVALUE ComputeBasin (const SIMPLE_ARRAY<LPOINT3D> &seeds);
01701 ERRVALUE ComputeBasin (const SIMPLE_ARRAY<LPOINT2D> &seeds);
01702 ERRVALUE ComputeDatabases ();
01703 ERRVALUE ComputeExtrema ();
01704 ERRVALUE ComputeFlowDirection ();
01705 template<typename _TT> ERRVALUE ComputeFlowPath (SIMPLE_ARRAY<LPOINT3D> &seeds);
01706 template<typename _TT> ERRVALUE ComputeFlowPath (const SIMPLE_ARRAY<LPOINT2D> &seeds);
01707 template<typename _TT> ERRVALUE ComputeRidge ();
01708 ERRVALUE ComputeStandard ();
01709 ERRVALUE ComputeBasinTables (const INT32 numBasins);
01710 ERRVALUE ComputeBasinAttributes (const INT32 numBasins);
01711 ERRVALUE ComputeWatershedAttributes ();
01712 ERRVALUE ComputeFlowPathTables ();
01713 ERRVALUE ComputeVectorTables (const INT32 numBasins);
01714 ERRVALUE ComputeTableFlowFeatures ();
01715 ERRVALUE ComputeTableWatershedVectorPolygons ();
01716 ERRVALUE ComputeTableWatershed ();
01717 ERRVALUE ComputeTablePour ();
01718 ERRVALUE ComputeTableLower ();
01719 ERRVALUE ComputeTableStreamOrder ();
01720 ERRVALUE ComputeTableStreamProperties ();
01721 ERRVALUE ComputeTableFlowDistance (const VECTORS vid);
01722 ERRVALUE ComputeTableFlowDown (const VECTORS vid);
01723 ERRVALUE ComputeTableUpper ();
01724 ERRVALUE ComputeWatershedRaster ();
01725 ERRVALUE ComputeWatershedVector ();
01726 ERRVALUE ComputeCatchmentArea ();
01727 ERRVALUE ComputeTopographicIndex ();
01728 template<typename _TT> ERRVALUE CalculateTopographicIndex ();
01729 ERRVALUE ComputeMaximumUpFlow ();
01730 ERRVALUE InitMaximumUpFlow ();
01731 ERRVALUE CalculateMaximumUpFlow ();
01732 ERRVALUE ComputeDownFlow ();
01733 ERRVALUE ComputeBoundaries (const VECTORS id, const INT32 limit);
01734 ERRVALUE FillDepressions ();
01735 ERRVALUE CalculateLowerDepressions (const INT32 watershed, SIMPLE_ARRAY<bool> &filling);
01736 ERRVALUE CalculateUpperDepressions (const INT32 watershed, SIMPLE_ARRAY<bool> &filling);
01737 ERRVALUE CalculateDepressionsToBeFilled (SIMPLE_ARRAY<bool> &filling, const SIMPLE_ARRAY<INT32> &depressions);
01738 void DestroyInternalObjects ();
01739 ERRVALUE MakeRasterObject (const RASTERS id);
01740 ERRVALUE MakeVectorObject (const VECTORS id);
01741 RVC::RASTER& GetRasterObject (const RASTERS id, const bool checkifopen = true);
01742 RVC::OBJECT& GetRasterTempFile (const RASTERS id);
01743 RVC::VECTOR& GetVectorObject (const VECTORS id, const bool checkifopen = true);
01744 RVC::OBJECT& GetVectorTempFile (const VECTORS id);
01745 ERRVALUE MakeDefaultRasterCalculation ();
01746 ERRVALUE MakeDefaultRasterCalculation (const RASTERS id);
01747 void SetObjItem (const OUTPUT id);
01748 ERRVALUE ClearVectorObject (const VECTORS id);
01749 void ClearObjItem (const OUTPUT id);
01750 void ClearObjItems ();
01751
01752 ERRVALUE CopyObjectTo (RVC::OBJECT& object, const char *filename);
01753
01754 template<typename _TT> ERRVALUE CalculateExtrema (const _TT tmin, const _TT tmax);
01755 template<typename _TT> ERRVALUE ReadAdjLine (RVC::NULLMASK& NullMask, _TT* adjbuf, UINT8* vldbuf, const INT32 line);
01756 template<typename _TT> ERRVALUE ReadAdjLine (_TT* adjbuf, const INT32 line);
01757 template<typename _TT> void MinMaxAdjLine(const _TT *const adjbuf, const UINT8 *const vldbuf, _TT* minbuf, _TT* maxbuf, const _TT tmin, const _TT tmax, const INT32 numColumns);
01758 template<typename _TT> ERRVALUE CalculateFlowDirection (const _TT tmax);
01759 ERRVALUE InitFlowDirectionOnFlat ();
01760 template<typename _TT> ERRVALUE ResolveFlowDirectionOnFlat ();
01761 ERRVALUE InitAccumulation ();
01762 ERRVALUE CalculateAccumulation ();
01763 ERRVALUE ReadDirLine(UINT8* dirbuf, const INT32 line);
01764 ERRVALUE ReadAccLine(UINT32* accbuf, const INT32 line);
01765 ERRVALUE InitWatershedRaster ();
01766 ERRVALUE CalculateWatershedRaster ();
01767 ERRVALUE ComputeBoundaryInitTemp (const INT32 limit);
01768 ERRVALUE ReadWtrLine(INT32* wtrbuf, const INT32 line);
01769 ERRVALUE ComputeBoundaryInitBinary ();
01770 template<typename _TT> ERRVALUE CalculateBoundaries (const VECTORS id);
01771 template<typename _TT> ERRVALUE ComputeAttributeWatershed ();
01772 template<typename _TT> ERRVALUE ComputeAttributeLines (RVC::VECTOR& vector);
01773 template<typename _TT> ERRVALUE ComputeAttributeNodes (RVC::VECTOR& vector);
01774 template<typename _TT> ERRVALUE ComputeAttributeDepression ();
01775 template<typename _TT> ERRVALUE FillSelectedDepressions (const SIMPLE_ARRAY<bool> &filling);
01776 ERRVALUE ComputeBasinMarkPolygons (const SIMPLE_ARRAY<LPOINT3D> &seeds);
01777 ERRVALUE ComputeBasinMarkPolygons (const SIMPLE_ARRAY<LPOINT2D> &seeds, SIMPLE_ARRAY<INT32>& polygons);
01778 ERRVALUE ComputeBasinRestorePolygons (const SIMPLE_ARRAY<LPOINT3D> &seeds);
01779 ERRVALUE ComputeBasinRestorePolygons (const SIMPLE_ARRAY<INT32>& polygons);
01780
01781 #endif // GENERATING_DOXYGEN_OUTPUT
01782 };
01783
01784 #ifndef GENERATING_DOXYGEN_OUTPUT
01785 DEFINE_ENUM_OP_BITWISE(WATERSHED::FLAGS)
01786 DEFINE_ENUM_OP_BITWISE(WATERSHED::OUTPUT)
01787 #endif
01788
01789 #endif
01790