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





5.00/5 (6投票s)
提取重叠的多边形并计算重叠面积,并为其编写 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。选择第一项。会弹出一个窗口。
填写所有字段。您可以在数据库平台中选择 SqlServer、Oracle 或 PostgreSQL。我选择了 SqlServer。实例字段用于服务器 IP 地址,数据库是将在 SqlServer 上创建的 Geodatabase 名称。输入 sa 和 sde 密码,然后在授权文件中输入许可证路径。在本例中,该路径是“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 文件。
我很乐意收到您的反馈