Topology Relations

TatukGIS Internet Server Samples


Source code

This sample demonstrates the use of topology functionality in the TatukGIS Internet Server (the XGIS_Shape.Relate function) to determine the relationship between two selected shapes. The possible relationships between the two shapes can be any of the following: EQUALITY, DISJOINT, INTERSECT, WITHIN, CROSS, TOUCH, CONTAINS, OVERLAP.

Select one shape to be Shape A (represented by blue color) and a second shape to be Shape B (represented by green color). Then click on the “Check Relations” button (appears after the two shapes have been selected) to generate a list of the types of geometric relations that the two selected shapes have in common.


relations.aspx    Top

                            
                            
                            
<%@ Page Language="VB" Debug="True" %>
<%@ Register TagPrefix="ttkGIS" Namespace="TatukGIS.IS" Assembly="TatukGIS.IS" %>
<%@ import Namespace="System.Data" %>
<script runat="server">

    Dim GisUtils As API.XGIS_Utils
    Dim shpA As API.XGIS_Shape
    Dim shpB As API.XGIS_Shape
    
    Dim Table as DataTable = New DataTable()
    Dim CheckTable as DataTable = New DataTable()
    
    Sub GIS_FullExtent_Click(sender As Object, e As ImageClickEventArgs)
        GIS.FullExtent
    End Sub
    
    Sub GIS_ZoomIn_Click(sender As Object, e As ImageClickEventArgs)
        GIS.ZoomIn
    End Sub
    
    Sub GIS_ZoomOut_Click(sender As Object, e As ImageClickEventArgs)
        GIS.ZoomOut
    End Sub
    
    Sub GIS_Smaller_Click(sender As Object, e As ImageClickEventArgs)
        GIS.Width  = Unit.Pixel( GIS.Width.Value  - 54 )
        GIS.Height = Unit.Pixel( GIS.Height.Value - 40 )
    End Sub
    
    Sub GIS_Larger_Click(sender As Object, e As ImageClickEventArgs)
        GIS.Width  = Unit.Pixel( GIS.Width.Value  + 54 )
        GIS.Height = Unit.Pixel( GIS.Height.Value + 40 )
    End Sub
    
    Sub Page_Load(sender As Object, e As EventArgs)
        GisUtils = New API.XGIS_Utils
    
        InitRelationTable()
        If not Page.IsPostBack() then
            CheckButton.Visible = False
            ViewRelations.Visible = False
        end if
        GIS.ImageType = XgisImageType.PNG24
    
    End Sub
    
    Sub GIS_Load(sender As Object, e As EventArgs)
        GIS.Open( GisUtils.GisSamplesDataDir + "topology2.shp" )
        GIS.FullExtent()
    End Sub
    
    
    Sub GIS_Click(sender As Object, e As ImageClickEventArgs)
    
        Dim ptg As API.XGIS_Point
        Dim shp As API.XGIS_Shape
    
       'let's locate a shape after click
        ptg = GIS.API.ScreenToMap(GisUtils.Point(e.x, e.y))
        shp = GIS.API.Locate(ptg, 5 / GIS.Zoom)   '5 pixels precision
    
       'remember shapes uid
        If Not shp Is Nothing then
            Select Case GetShape.SelectedItem.Value
                Case "A"
                    session("shpA") = shp.Uid
                    ViewRelations.Visible = False
                Case "B"
                    session("shpB") = shp.Uid
                    ViewRelations.Visible = False
                Case Else
            End select
        end if
    
        if (Not session("shpA") Is Nothing) AND (Not session("shpB") Is Nothing) then
            CheckButton.Visible = True
        end if
    End Sub
    
    Sub GIS_Paint(sender As Object, e As PaintEventArgs)
    
        Dim ll As API.XGIS_LayerSHP
        ll = GIS.API.Get("topology2")
        
        ll.Params.Area.OutlineColor = RGB(180, 180, 180)
        ll.Params.Area.Color = RGB(220, 220, 220)        
    
       'colour shapes A and B if necessary
        if Not session("shpA") Is Nothing then
           'get shapeA from uid and add some params
            shpA = ll.GetShape(session("shpA"))
            shpA = shpA.MakeEditable()
            shpA.IsSelected() = true
            shpA.Params.Area.Color = System.Convert.ToUInt32(RGB(0, 100, 250))
            shpA.Params.Labels.Value = "Shape A"
            shpA.Params.Labels.Color = System.Convert.ToUInt32(RGB(255, 255, 255))
            shpA.Params.Labels.FontColor = System.Convert.ToUInt32(RGB(0, 0, 250))
            shpA.Params.Labels.Position = API.XGIS_LabelPositions.XgisLabelPositionUpLeft
            GetShape.Items(0).Text = "Shape A: SELECTED (blue when selected)"
        end if
    
        if Not session("shpB") Is Nothing then
           'get shapeB from uid and add some params
            shpB = ll.GetShape(session("shpB"))
            shpB = shpB.MakeEditable()
            shpB.IsSelected() = true
            shpB.Params.Area.Color = System.Convert.ToUInt32(RGB(0, 220, 0))
            shpB.Params.Labels.Value = "Shape B"
            shpB.Params.Labels.Color = System.Convert.ToUInt32(RGB(255, 255, 255))
            shpB.Params.Labels.FontColor = System.Convert.ToUInt32(RGB(0, 250, 0))
            shpB.Params.Labels.Position = API.XGIS_LabelPositions.XgisLabelPositionDownRight
            GetShape.Items(1).Text = "Shape B: SELECTED (green when selected)"
        end if
        GIS.Draw()
    End Sub
    
    Sub CheckButton_Click(sender As Object, e As EventArgs)
    
        Dim ll As API.XGIS_LayerSHP
        ll = GIS.API.Get("topology2")
    
        shpA = Nothing
        shpB = Nothing
    
        if Not session("shpA") Is Nothing then
            shpA = ll.GetShape(session("shpA"))
            shpA = shpA.MakeEditable()
        end if
        if Not session("shpB") Is Nothing then
            shpB = ll.GetShape(session("shpB"))
            shpB = shpB.MakeEditable()
        end if
    
       'define table with check relations
        CheckTable.Columns.Add("Desc", GetType(string))
        dim dr as DataRow
    
    
        if (Not shpA is Nothing) and (Not shpB is Nothing)
    
            dim i as integer
            for i=0 to 11
               'check all defined relations
                if shpA.Relate(shpB, Table.Rows(i).Item("Relation")) then
                   'relation exist
                    dr = CheckTable.NewRow()
                    dr(0) = Table.Rows(i).Item("Desc")
                    CheckTable.Rows.Add(dr)
                End If
            next
    
            ViewRelations.Visible = True
            ViewRelations.DataSource = CheckTable.DefaultView
            DataBind()
            CheckButton.Visible = False
        end if
    End Sub
    
    Sub InitRelationTable()     'Prepare relations list
        Table.Columns.Add("Desc", GetType(string))
        Table.Columns.Add("Relation", GetType(string))
    
        dim dr as DataRow
    
        dr = Table.NewRow()
        dr(0) = "A EQUALITY B"
        dr(1) =  "T*F***FF*"
        Table.Rows.Add(dr)
    
        dr = Table.NewRow()
        dr(0) = "A DISJOINTS B"
        dr(1) = "FF*FF****"
        Table.Rows.Add(dr)
    
        dr = Table.NewRow()
        dr(0) = "A INTERSECTS B BY INTERIORS"
        dr(1) = "T********"
        Table.Rows.Add(dr)
    
        dr = Table.NewRow()
        dr(0) = "Interior of A INTERSECTS the boundary of B"
        dr(1) = "*T*******"
        Table.Rows.Add(dr)
    
        dr = Table.NewRow()
        dr(0) = "Boundary of A INTERSECTS the Interior of B"
        dr(1) = "***T*****"
        Table.Rows.Add(dr)
    
        dr = Table.NewRow()
        dr(0) = "Boundary of A INTERSECTS the Boundary of B"
        dr(1) = "****T****"
        Table.Rows.Add(dr)
    
        dr = Table.NewRow()
        dr(0) = "TOUCH - Boundary of A intersects with interior of B"
        dr(1) = "F**T*****"
        Table.Rows.Add(dr)
    
        dr = Table.NewRow()
        dr(0) = "TOUCH - Boundary of A intersects boundary of B"
        dr(1) = "F***T***"
        Table.Rows.Add(dr)
    
        dr = Table.NewRow()
        dr(0) = "A OVERLAPS B"
        dr(1) = "T*T***T**"
        Table.Rows.Add(dr)
    
        dr = Table.NewRow()
        dr(0) = "A CROSSES B"
        dr(1) = "T*T******"
        Table.Rows.Add(dr)
    
        dr = Table.NewRow()
        dr(0) = "A WITHIN B"
        dr(1) = "T*F**F***"
        Table.Rows.Add(dr)
    
        dr = Table.NewRow()
        dr(0) = "A CONTAINS B"
        dr(1) = "T*****FF*"
        Table.Rows.Add(dr)
    
    End Sub

</script>
<html>
<head>
    <title>TatukGIS IS Sample</title>
    <link href="style.css" type="text/css" rel="stylesheet" />
</head>
<body>
    <a name="top">
    <h1>Topology Relations
    </h1>
    <h2 class="comment"><a href="../../samplesAPI.htm">TatukGIS Internet Server Samples</a>
    </h2>
    <form runat="server">
        <table cellspacing="0" cellpadding="0" border="0">
            <tbody>
                <tr>
                    <td>
                        <asp:ImageButton id="GIS_FullExtent" onclick="GIS_FullExtent_Click" runat="server" ImageUrl="/TatukGIS_IS8/img/fullextent.gif"></asp:ImageButton>
                        <asp:ImageButton id="GIS_ZoomIn" onclick="GIS_ZoomIn_Click" runat="server" ImageUrl="/TatukGIS_IS8/img/zoomin.gif"></asp:ImageButton>
                        <asp:ImageButton id="GIS_ZoomOut" onclick="GIS_ZoomOut_Click" runat="server" ImageUrl="/TatukGIS_IS8/img/zoomout.gif"></asp:ImageButton>
                    </td>
                    <td>
                    </td>
                    <td align="right">
                        <asp:ImageButton id="GIS_Smaller" onclick="GIS_Smaller_Click" runat="server" ImageUrl="/TatukGIS_IS8/img/smaller.gif"></asp:ImageButton>
                        <asp:ImageButton id="GIS_Larger" onclick="GIS_Larger_Click" runat="server" ImageUrl="/TatukGIS_IS8/img/larger.gif"></asp:ImageButton>
                    </td>
                </tr>
                <tr>
                    <td colspan="3">
                        <p>
                            <ttkGIS:XGIS_VIEWERIS id="GIS" onclick="GIS_Click" runat="server" Height="280px" Width="360px" OnLoad="GIS_Load" BorderColor="CornflowerBlue" BorderWidth="1px" OnPaint="GIS_Paint"></ttkGIS:XGIS_VIEWERIS>
                        </p>
                    </td>
                </tr>
                <tr>
                    <td colspan="32">
                        <p>
                            <asp:RadioButtonList id="GetShape" runat="server">
                                <asp:ListItem Value="A" Selected="True" >
                                    <font class="navy">SELECT SHAPE A</font>
                                </asp:ListItem>
                                <asp:ListItem Value="B" cssClass="navy">
                                    <font class="green">SELECT SHAPE B</font>
                                </asp:ListItem>
                            </asp:RadioButtonList>
                        </p>
                        <p>
                            <asp:Button id="CheckButton" onclick="CheckButton_Click" runat="server" Font-Bold="True" Text="Check Relations"></asp:Button>
                            <asp:Repeater id="ViewRelations" runat="server">
                                <HeaderTemplate>
                                    <asp:Label id="Label1" runat="server" cssclass="bold">Relations between shapes A and
                                    B:</asp:Label>
                                    <ol>
                                </HeaderTemplate>
                                <ItemTemplate>
                                    <li class="normal">
                                        <%# Container.DataItem("Desc") %>
                                </ItemTemplate>
                                <FooterTemplate>
                                    </ol>
                                </FooterTemplate>
                            </asp:Repeater>
                        </p>
                    </td>
                </tr>
            </tbody>
        </table>
    </form>
    </a>
</body>
</html>