Tell me more ×
Geographic Information Systems Stack Exchange is a question and answer site for cartographers, geographers and GIS professionals. It's 100% free, no registration required.

I current have two tools that draw polygons using the same method. I dissolve the zones, delete the undissolved zones, and then add the dissolved polygon to the map.

I keep getting "Coordinates or measure are out of bounds" on add the GeometryCollection to the IFeature.Shape property. This worked in VB6 back in 9.1, but I know things have changed. The error only happens after the first dissolve. I am assuming when it dissolves the polygons, it isn't carrying over its XY Domain/Envelope. I was wondering if anyone has some insight on what to do to fix this problem?

Here is the code that is bombs out on, if you need any other of the subroutine's code let me know (please know this is a huge system):

Public Sub UpdateLayer_AddPolygon(ByVal str_LayerName As String, ByVal pPolygon_New As IPolygon)

    Dim pMxDoc_This As IMxDocument

    Dim pFeatLayer_Out As IFeatureLayer
    Dim pFeatClass_Out As IFeatureClass

    Dim pFeat_New As IFeature

    Dim pPolygon_Out As IPolygon
    Dim pGeomColl_In As IGeometryCollection
    Dim pGeomColl_Out As IGeometryCollection
    Dim pSegmentColl_Ring As ISegmentCollection
    Dim pMap As IMap


    Dim pClone_1 As esriSystem.IClone

    Dim i_SegNum As Long

    On Error GoTo ErrorHandler


    pMxDoc_This = My.ArcMap.Application.Document
    pMap = My.ArcMap.Document.FocusMap

    pFeatLayer_Out = FindLayer_ByLayerName(str_LayerName)
    pFeatClass_Out = pFeatLayer_Out.FeatureClass

    '¶¶ Verify that the specified layer is of type polygon:
    If Not pFeatClass_Out.ShapeType = esriGeometryType.esriGeometryPolygon Then
        MsgBox("The output layer, ''" + str_LayerName + "'' must be of type polygon.", vbExclamation, "CW Inspection Operations")
        Exit Sub
    End If


    'Create new polygon in collection:
    pGeomColl_Out = New Polygon

    'Clone the incoming polygon, so we can use the references to the new segments:
    pClone_1 = pPolygon_New
    pGeomColl_In = pClone_1.Clone


    'Transfer the segments from the polygon paths to new rings and add the rings to the new polygon:
    For i_SegNum = 0 To pGeomColl_In.GeometryCount - 1
        pSegmentColl_Ring = New Ring
        pSegmentColl_Ring.AddSegmentCollection(pGeomColl_In.Geometry(i_SegNum))
        pGeomColl_Out.AddGeometry(pSegmentColl_Ring)
    Next i_SegNum



    'Store the polygon in the specified layer:
    pFeat_New = pFeatClass_Out.CreateFeature
    pFeat_New.Shape = pGeomColl_Out 'Crashes Here
    pFeat_New.Store()

    'Refresh the display.
    pMxDoc_This.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, Nothing, Nothing)

    Exit Sub



ErrorHandler:

    Select Case Err.Number
        Case -2147220936  'coordinates or measures out of bounds (80040238)
            MsgBox("The Coordinates or Measures are Out of Bounds.", _
                    vbInformation, "Out of Bounds")
            Exit Sub
        Case Else
            MsgBox(Err.Number & ": " & "Could not draw polygon in this area. The Coordinates or Measures are Out of Bounds.")
    End Select

    Exit Sub


End Sub 'UpdateLayer_AddPolygon

And here is the dissolve code:

Public Sub DissolvePerim(ByVal str_FeatClassName_Perim As String)

    Dim pFeatLayer_Output As IFeatureLayer
    Dim pFeatClass_Output As IFeatureClass
    Dim pBasicGeoProc_1 As IBasicGeoprocessor
    Dim pFeatClass_Input As IFeatureClass
    Dim pWorkspaceName_New As IWorkspaceName
    Dim pFeatClassName_1 As IFeatureClassName
    Dim pTable_Input As ITable
    Dim pTable_Output As ITable

    'dataset objects:
    Dim pDatasetName_1 As IDatasetName

    'layer objects:
    Dim pFeatLayer_Input As IFeatureLayer

    Dim pFeatLayer_Perim As IFeatureLayer
    Dim pFeatLayer_Perim_Dissolved As IFeatureLayer

    Dim pFeatClassName_Perim As IFeatureClassName
    Dim pFeatClassName_Perim_Dissolved As IFeatureClassName

    Dim str_PathedFileName_DB As String

    Dim str_SummaryFields As String

    Dim pField_1 As IField
    Dim pFieldEdit_1 As IFieldEdit

    Dim pDataset_Temp As IDataset


    'Locate the database file:
    str_PathedFileName_DB = GetNPath_DB() + "CWInspect_Perims.mdb"

    If g_b_DebugMode Then
        MsgBox("Database file: ''" + str_PathedFileName_DB + "''", vbInformation, "CW Inspection Operations")
    End If

    'Find the perimeter layer:
    pFeatLayer_Input = FindLayer_ByFeatClassName(str_FeatClassName_Perim)

    '¶¶
    If pFeatLayer_Input Is Nothing Then
        MsgBox("The ''" + str_FeatClassName_Perim + "'' layer was not found")
        Exit Sub
    End If

    'Find the dissolved perimeter layer:
    pFeatLayer_Output = FindLayer_ByFeatClassName(str_FeatClassName_Perim + "_dissolved")

    '¶¶
    If pFeatLayer_Output Is Nothing Then
        MsgBox("The ''" + str_FeatClassName_Perim + "_dissolved'' layer was not found", vbApplicationModal Or vbCritical Or vbOKOnly, "CW Inspection Operations")
        Exit Sub
    End If

    'Get the input table:
    pTable_Input = pFeatLayer_Input
    ' ( Use the ITable interface from the FeatureLayer, not from the FeatureClass )

    '¶¶
    If pTable_Input Is Nothing Then
        MsgBox("Table QI failed.", vbApplicationModal Or vbCritical Or vbOKOnly, "CW Inspection Operations")
        Exit Sub
    End If

    'Make sure there is a field named "SUB" in the input layer:
    If pTable_Input.FindField("SUB") = -1 Then
        'Create the "SUB" field:
        pField_1 = New Field
        pFieldEdit_1 = pField_1
        pFieldEdit_1.Name_2 = "SUB"
        pFieldEdit_1.AliasName_2 = "SUB"
        pFieldEdit_1.Type_2 = esriFieldType.esriFieldTypeString
        pFieldEdit_1.Length_2 = 5
        pTable_Input.AddField(pField_1)
    End If

    'Get the feature class properties needed for the output:
    pFeatClass_Input = pFeatLayer_Input.FeatureClass
    pFeatClassName_1 = New FeatureClassName
    With pFeatClassName_1
        .FeatureType = esriFeatureType.esriFTSimple
        .ShapeFieldName = "Shape"
        .ShapeType = pFeatClass_Input.ShapeType
    End With

    Call DeleteFeatureClass(str_PathedFileName_DB, "dissolve_work")

    'Set the output location and output feature class name:
    pWorkspaceName_New = New WorkspaceName
    pWorkspaceName_New.WorkspaceFactoryProgID = "esriDataSourcesGDB.AccessWorkspaceFactory.1"
    pWorkspaceName_New.PathName = str_PathedFileName_DB

    pDatasetName_1 = pFeatClassName_1
    pDatasetName_1.Name = "dissolve_work"
    pDatasetName_1.WorkspaceName = pWorkspaceName_New

    'Perform the dissolve:
    pBasicGeoProc_1 = New BasicGeoprocessor
    str_SummaryFields = "Dissolve.Shape, Sum.SUB"
    pTable_Output = pBasicGeoProc_1.Dissolve(pTable_Input, False, "SUB", str_SummaryFields, pDatasetName_1)
    ' ( Since we are performing a spatial dissolve, we must use the operation code
    '   "Dissolve" on the Shape field. )
    ' ( The "dissolveField" parameter MUST point to a text field in order to work properly. )

    pFeatClass_Output = pTable_Output

    '¶¶
    If pFeatClass_Output Is Nothing Then
        MsgBox("FeatureClass QI failed.")
        Exit Sub
    End If

    pFeatLayer_Perim = FindLayer_ByFeatClassName(str_FeatClassName_Perim)
    pFeatLayer_Perim_Dissolved = FindLayer_ByFeatClassName(str_FeatClassName_Perim + "_dissolved")

    pFeatLayer_Output.FeatureClass = pFeatClass_Output


    'Remove all shapes from the perimeter (un-dissolved) layer:
    Call EmptyLayer(FindLayer_ByFeatClassName(str_FeatClassName_Perim), False)

    'Get the perimeter workspace and feature class name object:
    pDataset_Temp = pFeatLayer_Perim.FeatureClass
    pFeatClassName_Perim = pDataset_Temp.FullName

    'Get the dissolved perimeter workspace and feature class name object:
    pDataset_Temp = pFeatLayer_Perim_Dissolved.FeatureClass
    pFeatClassName_Perim_Dissolved = pDataset_Temp.FullName

    'Copy the dissolved perimeter shapes to the perimeter layer.
    Call CopyLayerShapes(pFeatClassName_Perim_Dissolved, pFeatClassName_Perim, Nothing)


End Sub 'DissolvePerim
share|improve this question

Know someone who can answer? Share a link to this question via email, Google+, Twitter, or Facebook.

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Browse other questions tagged or ask your own question.