在现代城市管理中,地理信息系统(GIS)发挥着越来越重要的作用。GIS不仅能够帮助用户查看对象在GIS环境中的位置,还能展示属性数据并生成基于GIS的报告。如今,组织管理者除了需要常规报告外,还需要基于GIS的报告。这些报告能够为管理者提供良好的视野,帮助他们做出正确的决策。
为了使本文内容更加实用,需要熟悉以下概念和软件:
假设所在城市的社区即将修建一条新街道,这条街道将与许多建筑物相交,这些建筑物可能需要被拆除。为此,市政府首先需要设计这条街道的边界,并检查那些完全或部分需要拆除的建筑物,以便从业主那里购买房屋或为居民准备新的地方。在这种情况下,可以将新街道的边界视为一个大多边形,而与之相交的建筑物或地块则视为小多边形。
在ArcMap中,按下CTRL+F,然后在搜索窗口中输入“Create Enterprise Geodatabase”。选择第一个选项,将显示一个窗口。填写所有字段。可以选择SqlServer、Oracle或PostgreSQL作为数据库平台。选择了SqlServer。实例字段是服务器的IP地址,数据库是将在SqlServer上创建的Geodatabase的名称。输入sa和sde密码,并输入授权文件的路径。在案例中,路径是“C:\Program Files (x86)\ESRI\License10.2\sysgen\keycodes”。最后点击OK。一个GeoDataBase将在SqlServer中创建。
打开ArcGIS(使用的是10.2.2版本),然后点击标准工具栏上的目录图标。如果看不到目录图标,右键点击菜单栏,然后选择标准子菜单。在目录中,双击添加数据库连接。一个弹出窗口(数据库连接)将出现。在该窗口中输入用于连接到在SqlServer中创建的数据库的用户名和密码(GeoDB)。一个连接被添加到目录窗口中的数据库连接组中。将这个连接重命名为“连接到GeoDB”。右键点击“连接到GeoDB”,选择新建,然后选择要素数据集。一个名为新建要素数据集的窗口将出现。
在ArcMap中,在目录窗口中将项目图层和建筑物图层拖放到目录内容窗口中。点击编辑器,并选择选项菜单。从版本化标签中选择“编辑数据库的一个版本,具有撤销和重做的能力”,然后点击确定。再次点击编辑器,并选择开始编辑。在创建要素窗口中选择建筑物要素类。如果看不到创建要素窗口,请按照此路径:编辑器->编辑窗口->创建要素。在中间窗口中开始绘制多边形。这些多边形指定了城市中建筑物的范围。
Microsoft SqlServer有一个名为STIntersects的方法。这个函数获取一个形状字段,并返回重叠的多边形。
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(b.SHAPE).STArea() as OnTtheWayArea FROM dbo.BUILDING b WHERE b.SHAPE.STIntersects(@PeojectShape)=1;
运行SQL选择后,将看到以下结果。创建一个存储过程并将此选择放入其中。将这个存储过程命名为sp_ReturnPolygon。可以在Microsoft网站上完成OGC方法对几何实例的操作。
在ArcMap中,在目录窗口中将项目图层和BuildingsOnTtheWay图层拖放到目录内容窗口中。按照此路径:文件/共享为/服务。一个窗口将出现。选择发布服务,然后点击下一步。点击浏览按钮,然后选择发布GIS服务。点击下一步并输入连接属性。点击完成并输入文件夹名称。输入MainService作为文件夹名称。点击继续。在右侧选择功能并检查映射和WFS。点击分析。如果没有错误或高警告,那么点击发布。将在下一篇文章中解释如何解决错误或高警告。这是WFS服务的地址:http://localhost:6080/arcgis/rest/services/MainService/BuildingOnTheWay/MapServer。
打开Visual Studio 2015。选择文件/新建/项目。一个窗口将出现。在新项目窗口中选择Visual C#/ASP.NET Web应用程序。输入WebAPI作为名称。点击确定。另一个窗口将出现,选择Web API,然后点击确定。在解决方案资源管理器中,右键点击模型文件夹,然后选择添加/新建项。在出现的窗口中选择数据/ADO.NET实体数据模型。用SpatialWebServicesModel完成名称字段。点击确定。右键点击中间窗口,然后选择从数据库更新模型。创建数据库连接并选择在步骤4中创建的存储过程(sp_ReturnPolygon)。点击完成并保存所有更改。在解决方案资源管理器中选择控制器文件夹,右键点击并选择添加/控制器。选择Web API 2控制器 - 空。点击添加。在下一个窗口中留下控制器名称(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方法内部将类属性传递给sp_ReturnPolygon函数。
在解决方案资源管理器中,右键点击项目名称,然后选择发布。在右侧选择连接,然后从组合框中选择文件系统。选择目标位置,最后点击发布。打开IIS(在Windows 7、8、10中,在开始按钮的搜索框中输入IIS)。右键点击默认网站,然后选择添加应用程序。在新窗口中填写别名文本框。使用浏览按钮,选择项目已发布的文件夹。选择应用程序池“ASP.Net v4.0”。最后点击确定。
$(document).ready(function () {
$.ajax({
type: "POST",
url: 'http://localhost/SpatialWebServices/PostReturnPolygon',
contentType: "application/json; charset=utf-8",
data: JSON.stringify({
'objectID': 412
}),
success: function (res) {
var urlWFS = 'http://localhost: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);
}
});
});