65.9K
CodeProject 正在变化。 阅读更多。
Home

如何提取重叠的多边形并计算重叠面积,并为其编写 API?

starIconstarIconstarIconstarIconstarIcon

5.00/5 (6投票s)

2017年10月12日

CPOL

7分钟阅读

viewsIcon

22651

downloadIcon

68

提取重叠的多边形并计算重叠面积,并为其编写 API。

引言

如今,大多数系统都启用了空间组件,这些组件允许用户在 GIS 环境中查看对象的地理位置以及属性数据,并生成基于 GIS 的报告。今天,组织经理除了常规报告外,还需要基于 GIS 的报告。这些报告为管理者提供了一个良好的视野,以便他们做出正确的决策。

背景

为了使本文有用,您应该熟悉以下概念和软件。

GIS、WPS、ARC Map、Esri JavaScript、API、Jquery、IIS、SQL Server、TSql、Visual Studio

使用代码

假设你们城市社区要修建一条新街道。新街道与许多应被拆除的建筑物相交。为此,市政部门应首先设计街道边界,并检查完全需要拆除或部分拆除的建筑物,以便从房主那里购买房屋或为居民准备新住所。在这种情况下,我们可以将新街道边界视为一个大而多边形,将相交的建筑物或地块视为小而多边形。

本项目会影响与之重叠的建筑物。现在,项目经理要求你开发一个实现此场景的 Web API。

解决方案

  • 第一步:在ArcMap中创建数据库

在 ArcMap 中按 CTRL+F,然后在搜索窗口中键入 Create Enterprise Geodatabase。选择第一项。会弹出一个窗口。

填写所有字段。您可以在数据库平台中选择 SqlServerOraclePostgreSQL。我选择了 SqlServer。实例字段用于服务器 IP 地址,数据库是将在 SqlServer 上创建的 Geodatabase 名称。输入 sasde 密码,然后在授权文件中输入许可证路径。在本例中,该路径是“C:\Program Files (x86)\ESRI\License10.2\sysgen\keycodes”。

最后单击确定。将在 SqlServer 中创建地理数据库

创建地理数据库的另一种方法是使用 SqlServer(您也可以使用其他 DBMS)。打开 Microsoft SqlServer 并创建数据库。我将此数据库命名为“GeoDB”。

在 ArcGIS 中选择启用地理数据库选项。执行此操作后,ArcGIS 将在 GeoDB 中创建一些对象,例如表、存储过程和函数,用于管理地理数据库。

我完全不推荐这种方式。

  • 第二步:在 ArcGIS 中创建要素类

打开 ArcGIS(我使用的是 10.2.2 版本),然后单击标准工具栏中的目录图标

如果您看不到目录图标,请右键单击菜单栏,然后选择标准子菜单。

目录数据库连接组中,双击添加数据库连接

将弹出一个弹出窗口(数据库连接)。在此窗口中,输入用户名和密码以连接到您在 SqlServer(GeoDB)中创建的数据库。

已将连接添加到目录窗口数据库连接组中。我将此连接重命名为“连接到 GeoDB”。

右键单击“连接到 GeoDB”,选择新建,然后选择要素数据集

将出现一个名为新建要素数据集的窗口。

右键单击“连接到 GeoDB”,选择新建,然后选择要素类

将出现一个名为新建要素数据集的窗口。

将出现一个窗口。输入要素数据集名称,然后单击“下一步”并“完成”。我输入“city”作为要素数据集。在city 要素数据集中,右键单击并选择新建要素类。在出现的窗口中,输入“Project”作为要素类的名称,然后单击“下一步”。在下一步中,选择“使用配置关键字”,然后在组合框中选择“GEOMETRY”。如果您忽略这一点,地理数据库中的数据将存储为“int”而不是“GEOMETRY”。在下一步中,输入要添加到Project 要素类的属性。默认情况下,ArcGIS 会添加两个属性:OBJECTID 和 SHAPE。我添加了另一个属性,其名称为“ProjectName”。最后单击“完成”。

请注意,ArcGIS 中的每个要素类都映射到数据库中的一个表,要素类中的每个属性都映射到表中的一个字段。

要素数据集用于分组要素类。

与上述类似,添加两个要素类。第一个名称是“Building”,第二个是“BuildingsOnTtheWay”。

因此,我们有三个图层(要素类)

要素图层(图层或数据库中的表) 描述 属性(字段)
项目 此图层指定城市的项目 OBJECTID
SHAPE
ProjectName
构建 此图层指定城市的建筑物 OBJECTID
SHAPE
BuildingName
BuildingsOnTtheWay WPS 服务的结果(我将在后面解释此服务) OBJECTID
SHAPE
Area
OnTtheWayArea
  • 第三步:向图层(Project、Building)添加多边形

在 ArcMap 中,在目录窗口(1)中,将Project 图层和Building 图层拖放到内容列表(2)窗口。

单击编辑器(3)并选择选项菜单。在版本控制选项卡中,取消选中“编辑数据库的版本,以便能够撤消和重做”,然后单击“确定”。

再次单击编辑器(3)并选择开始编辑。在创建要素(4)窗口中,选择Building 要素类。

如果看不到创建要素窗口,请遵循以下路径

编辑器->编辑窗口->创建要素

在中部窗口(5)开始绘制多边形。这些多边形指定了城市建筑物的范围。

  • 第四步:编写 TSQL SELECT 语句以提取重叠的多边形并计算这些建筑物的重叠面积

Microsoft SqlServer 有一个名为 STIntersects方法。此函数获取一个 shape 字段并返回重叠的多边形。

delete BUILDINGSONTTHEWAY

declare @PeojectShape geometry
select @PeojectShape=p.SHAPE from PROJECT p where p.OBJECTID = 412
 
Insert BUILDINGSONTTHEWAY(OBJECTID, SHAPE,TotalArea,OnTtheWayArea)
       select ROW_NUMBER() over (order by objectid) ObjectID, b.SHAPE,b.SHAPE.STArea() TotalArea,  @PeojectShape.STIntersection(SHAPE).STArea() asOnTtheWayArea
       from dbo.BUILDING b where b.SHAPE.STIntersects(@PeojectShape)=1

运行 SQL SELECT 语句后,您将看到下面的结果。

创建存储过程并将此 SELECT 语句放入其中。我将此存储过程命名为 sp_ReturnPolygon

您可以在 Microsoft 网站上找到几何实例上的 OGC 方法的完整信息。

  • 第五步:在 ArcGIS Server 上发布 WFS 服务

在 ArcMap 的目录窗口中,将Project 图层和BuildingsOnTtheWay 图层拖放到内容列表窗口。遵循以下路径:文件/共享方式/服务

将出现一个窗口。选择发布服务(1),然后单击“下一步”。单击浏览按钮(2)并选择发布 GIS 服务(3)。单击“下一步”并输入连接属性(4)。单击“完成”并输入文件夹名称(5)。我输入MainService 作为文件夹名称单击继续(6)

在右侧选择功能,然后勾选制图WFS。单击分析。如果没有错误严重警告,则单击发布

我将在下一篇文章中解释如何解决错误严重警告

这是 WFS 服务的地址

https://:6080/arcgis/rest/services/MainService/BuildingOnTheWay/MapServer.

  • 第六步:编写 API

打开 Visual Studio 2015。选择 文件/新建/项目。将出现一个窗口。

新建项目窗口中,选择 Visual C#/ASP.NET Web 应用程序。将WebAPI 输入为名称。单击确定。将出现另一个窗口,选择Web API,然后单击确定

解决方案资源管理器中,右键单击 Models 文件夹,选择添加/新建项。在出现的窗口中,选择数据/ADO.NET 实体数据模型。使用 SpatialWebServicesModel 填写名称字段。单击确定

右键单击中间窗口,然后选择从数据库更新模型

创建数据库连接,然后选择您在第四步中创建的存储过程(sp_ReturnPolygon)。单击完成并保存所有更改。

解决方案资源管理器中,选择 *Controller* 文件夹,右键单击并选择添加/控制器

选择Web API 2 Controller - Empty。单击“添加”。

在下一个窗口中,保留控制器名称(DefaultController)并单击“确定”。

您有一个函数映射到数据库中的存储过程(sp_ReturnPolygon)。默认情况下,函数名与存储过程名相同。现在,我们需要编写一个 Web API 并调用 sp_ReturnPolygon 函数。

因此,在 DefaultController 中编写此代码。

GeoDBEntities db;
        public DefaultController()
        {
            db = new GeoDBEntities();
        }

        [HttpGet]
        public List<sp_ReturnPolygon_Result> IsPointWithinPolygon()
        {
            var res = db.sp_ReturnPolygon().ToList();
            return res;

        }

请注意,.NET 中的 Web API 只接受模型(类)。因此,如果您的函数(sp_ReturnPolygon)有一个参数且 API 类型为 Post,您必须先创建一个类并为其设置一个属性,然后将此类传递给 API 方法,并在 API 方法内部将 Class 属性传递给 sp_ReturnPolygon 函数

请参阅下图

  • 第七步:将 Web API 发布到 IIS

解决方案资源管理器中,右键单击项目名称并选择发布

在右侧选择连接,然后从组合框中选择文件系统。选择目标位置,最后单击发布

打开IIS(在 Windows 7、8、10 中,在开始按钮的搜索框中输入IIS

右键单击默认网站并选择添加应用程序。在新窗口中,填写别名文本框。使用浏览按钮,选择项目已发布的文件夹。选择应用程序池“ASP.Net v4.0”。最后单击“确定”。

  • 第八步:使用 Web API 和 WFS 服务

打开 Notepad++,并在下方代码处输入。

    $(document).ready(function () {
        $.ajax({
            type: "POST",
            url: 'https:///SpatialWebServices/PostReturnPolygon',
            contentType: "application/json; charset=utf-8",
            data: JSON.stringify({ 'objectID': 412 }),
            success: function (res) {
                //In the result is attributes
                //
                var urlWFS = 'https://:6080/arcgis/rest/services/MainService/BuildingOnTheWay/MapServer'
                var map = new esri.Map(nameDivMap);
                var layer = new esri.layers.ArcGISDynamicMapServiceLayer(urlWFS);
                map.addLayer(layer);
            },
            error: function (e) {
                console.log(e.error);
            }
        });

    });

另存为HTML 并用浏览器运行 HTML 文件。

我很乐意收到您的反馈

© . All rights reserved.