# WMS服务
- Web Map Service(Web地图服务),简称WMS,由开放地理信息联盟(OGC)制定
- 利用具有地理空间位置信息的矢量数据制作地图,将地理数据可视化
- 根据用户请求返回相应的地图(包括PNG/GIF/JPEG等栅格形式或者是SVG和WEB CGM等矢量形式)
# 服务操作方式
- GetCapabilities:获取WMS的能力文档(即元数据文档),里面包含服务的所有信息
http://tdt.fuzhou.gov.cn/service/WMS/DMDZ?version=1.1.1&request=GetCapabilities&service=WMS
//参数说明
service:(必选) 字符类型,服务类型值为"WMS"
request:(必选) 字符类型,请求的操作名称,值为"GetCapabilities"
version:(可选) 字符类型,值为请求的WMS的版本号
format:(可选) MIME类型,值为服务元数据的输出格式
updateSequence:(可选) 字符类型,值有none、any、equal、lower、higher,表示缓存数据更新的方式
- GetMap:获取地图图片。根据客户端发出的请求参数在服务端进行检索,返回一个地图图像
http://www.someserver.com/wms?VERSION=1.3.0&REQUEST=GetMap&CRS=CRS:84
&BBOX=-97.105,24.913,-78.794,36.358&WIDTH=560&HEIGHT=350
&LAYERS=BUILTUPA_1M,COASTL_1M,POLBNDL_1M&STYLES=0XFF8080,0X101040,BLACK
&FORMAT=image/png&BGCOLOR=0xFFFFFF&TRANSPARENT=TRUE&EXCEPTIONS=INIMAGE
//参数说明
service:(必选) 字符类型,服务类型标识值为"WMS"
request:(必选) 字符类型,值为"GetMap"
version:(必选) 字符类型,值为请求的WMS的版本号
layers:(必选) 字符类型,值为一个或多个地图图层列表,多个图层之间用”,”隔开
styles:(必选) 字符类型,值为请求图层的地图渲染样式
CRS:(必选) 字符类型,值为坐标参照系统
BBOX:(必选) Wkt格式,值为某个CRS下的地图边界范围的坐标序列
width:(必选) 整型类型,值为地图图片的像素宽度
height:(必选) 整型类型,值为地图图片的像素高度
format:(必选) 字符类型,值为地图的输出格式
transparent:(可选) 字符类型,值为true或者false,用来表示地图图层是否透明(默认情况下是不透明的)
bgcolor:(可选) 值为十六进制的RGB值,表示地图的背景颜色
exceptions:(可选) 值为WMS的异常信息报告的格式(默认情况下是XML格式)
time:(可选) 时间类型,值为时间值,表示需要在图层中有时间信息
elevation:(可选) 数字类型,值为高程值,表示需要在图层中有高程信息
- GetFeatureInfo:根据用户请求的信息,返回地图上某些要素信息,以HTML,GML或ASCII的格式表示
http://www.someserver.com/wms?request=GetFeatureInfo&version=1.3.0&format=image/jpeg
&bbox=-4.0325,-2.9078,40.5189,41.6436&query_layers=Countries,Cities&info_format=text/html
&height=400&width=400&style=&i=290&j=246&
//参数说明
service:(必选) 字符类型,服务类型标识值为"WMS"
request:(必选) 字符类型,值为"GetFeatureInfo"
version:(必选) 字符类型,值为请求的WMS的版本号
map request part:(必选) 字符类型,值为获得地图的部分操作参数
query_layers:(必选) 字符类型,值为查询的一个或多个地图图层列表,多个图层之间用”,”隔开
info_format:(必选) MIME类型,值为请求信息的返回类型
I:(必选) 整型类型,值为待查询点的在地图图片上的像素列号
J:(必选) 整型类型,值为待查询点的在地图图片上的像素行号
feature_count:(可选) 整型类型,值为返回信息中的要素的个数(默认是1)
exceptions:(可选) 值为WMS的异常信息报告的格式(默认情况下是XML格式)
# WMTS服务
- Web Map Tile Service(Web地图瓦片服务),简称WMTS,由开放地理信息联盟(OGC)制定
- 不同于WMS,最重要的特征是采用缓存技术能够缓解WebGIS服务器端数据处理的压力,加快加载速度
- WMTS是OGC主推的缓存技术规范,是目前各种缓存技术相互兼容的一种方法,支持RESTful访问
# 服务操作方式
- GetCapabilities:获取WMTS的能力文档(即元数据文档),里面包含服务的所有信息
http://service.sdmap.gov.cn/tileservice/sdpubmap?tk=9cc3e9deb3cf643b6f133717c333d16d
&service=WMTS&request=GetCapabilities
//参数说明
service:(必选) 字符类型,服务类型值为“WMTS”
request:(必选) 字符类型,请求的操作名称,值为“GetCapabilities”
acceptVersions:(可选) 字符类型,值为请求的WMTS的版本号
sections:(可选) 字符类型,请求元数据文档0或多个节的名称,多个用","隔开。为空默认返回所有
updateSequence:(可选) 字符类型,值为increased,为空时默认返回最新的元数据文档
acceptFormat:(可选) MIME类型,值为服务元数据的输出格式
- GetTile:获取地图瓦片。根据客户端发出的请求参数在服务端进行检索,服务器端返回地图瓦片图像
http://service.sdmap.gov.cn/tileservice/sdrasterpubmap?service=WMTS&version=1.0.0
&request=GetTile&tilematrix=18&layer=SDRasterPubMap&style=default&tilerow=39646
&tilecol=216107&tilematrixset=raster&format=image%2Fjpeg&tk=39606602a547762609c4d1d585a84827
//参数说明
service:(必选) 字符类型,服务类型标识值为'WMTS'
request:(必选) 字符类型,请求的操作值为'GetTile'
version:(必选) 字符类型,值为请求的WMTS的版本号
layer:(必选) 字符类型,值为请求的图层名称
style:(必选) 字符类型,值为请求图层的渲染样式
format:(必选) 字符类型,值为瓦片地图的输出格式
tileMatrixSet:(必选) 字符类型,瓦片矩阵数据集,其值在服务的元数据文档中指定
tileMatrix:(必选) 字符类型,瓦片矩阵,其值在服务的元数据文档中指定
tileRow:(必选) 整型类型,值为大于0的整数,表示瓦片矩阵的行号
tileCol:(必选) 整型类型,值为大于0的整数,表示瓦片矩阵的列号
Other sample dimensions:(可选) 字符类型,其他允许的参数
- GetFeatureInfo:通过在WMTS图层上指定一定的条件,返回指定的地图瓦片内容对应的要素信息
http://www.maps.bob/maps.cgi?service=WMTS&request=GetFeatureInfo&version=1.0.0
&layer=coastlines&style=default&format=image/png&TileMatrixSet=WholeWorld_CRS_84
&TileMatrix=10m&TileRow=1&TileCol=3&J=86&I=132&InfoFormat=application/gml+xml;version=3.1
//参数说明
service:(必选) 字符类型,服务类型值为'WMTS'
request:(必选) 字符类型,请求的操作值为'GetFeatureInfo'
version:(必选) 字符类型,值为请求的WMTS的版本号
J: (必选) 整型类型,值为大于0的整数,表示瓦片上一指定像素点的行号
I: (必选) 整型类型,值为大于0的整数,表示瓦片上一指定像素点的列号
info_format: (必选) MIME类型,值为请求信息的返回类型
layer, style, format, Sample dimension, tileMatrixSet, tileMatrix, tileRow, tileCol:(必选)
这些参数的值应与请求GetTile的相应参数保持一致
# WFS服务
- Web Feature Service(Web矢量要素服务),简称WFS,由开放地理信息联盟(OGC)制定
- 返回矢量级的地理标记语言GML编码,提供对矢量数据的增删改查,是对Web地图服务的进一步深入
- WFS通过Filter构造查询条件,支持基于空间几何关系、属性域的查询
注意
WMS返回的是图层级的地图影像,而WFS是为了返回纯地理数据而设计的
# 服务操作方式
WFS服务接口规范定义了6种操作。其中,前三个为必须实现的操作
- GetCapabilities:用于查询WFS服务的能力信息
http://tdt.fuzhou.gov.cn/service/WFS/DMDZ?service=WFS&request=GetCapabilities&version=1.0
//参数说明
service:(必选) 字符类型,服务类型值为"WFS"
request:(必选) 字符类型,请求的操作名称,值为"GetCapabilities"
versions:(可选) 字符类型,值为请求的WFS的版本号
- DescribeFeatureType:返回描述可以提供服务的任何矢量结构的XML文档
http://tdt.fuzhou.gov.cn/service/WFS/DMDZ?service=WFS&request=DescribeFeatureType
&typename=DMDZ:地名&version=1.0.0
//参数说明
service:(必选) 字符类型,服务类型值为"WFS"
request:(必选) 字符类型,请求的操作名称,值为"DescribeFeatureType"
typeName:(可选) 字符类型,要素类型的列表,多个值之间用“,”隔开,默认解析包括的全部要素类型
outputFormat:(可选) MIME类型,值为输出格式
- GetFeature:用于向WFS的客户端程序提供查询特定地理信息的能力,通过GetFeature操作可以由指定的属性条件、空间条件或者两者叠加的条件进行空间查询 GetFeature 请求 (opens new window)
http://tdt.fuzhou.gov.cn/serviceaccess/WFS/DMDZ_WFS-G?service=WFS&request=GetFeature
&typename=DMDZ:地名&version=1.0.0&maxFeature=20
//参数说明
service:(必选) 字符类型,服务类型标识值为“WFS”
request:(必选) 字符类型,请求的操作值为“GetFeature”
typeName:(必选) 字符类型,值为请求的要素类型的名称,多个名称之间用“,”隔开
version:(可选) 字符类型,值为请求的WFS的版本号
outputFormat:(可选) MIME类型,值为输出格式
resultType:(可选) 字符类型,值为请求的结果类型
propertyName:(可选) 字符类型,值为请求要素的属性名,多个值之间用“,”隔开
featureVersion:(可选) 字符类型,要素的版本,ALL返回要素的所有版本,没有值返回要素的最新版本
maxFeature:(可选) 整型类型,值为请求要素的最大数,默认值为满足查询的所有结果集
expiry:(可选) 数字类型,要素被锁定的时间
SRSName:(可选) 字符类型,值为坐标系统名
featureID:(可选) 字符类型,值为要素的ID,多个ID之间用“,”隔开
filter:(可选) 请求要素的过滤条件
bBox:(可选) Wkt格式,请求指定要素查询范围,可以替代featureId和filter参数
sortby:(可选) 字符类型,查询结果属性值的排序依据
- Transaction:使客户端可对服务器端所提供的地图要素类执插入,更新,删除等命令
- GetGmlObject:通过XLink获取GML对象
- LockFeature:在事务过程中锁定要素
# WCS服务
- Web Coverage Service(Web栅格服务),简称WMTS,由开放地理信息联盟(OGC)制定
- 面向空间影像数据,它将包含地理位置的地理空间数据作为"覆盖(Coverage)"在网上相互交换,如卫星影像、数字高程数据等栅格数据
# 服务操作方式
- GetCapabitities:返回服务级元数据,它是对服务信息内容和要求参数的一种描述
- DescribeCoverage:支持用户从特定WCS服务器获取一个或多个覆盖的详细的描述
- GetCoverage:可根据查询要求返回一个包含或者引用被请求的覆盖数据的响应
# TMS服务
- TMS是指OSGeo的切片地图服务规范(Tile Map Service),提供的操作允许用户按需访问切片地图
- 将切片保存到了本地,使得访问速度更快,还支持修改坐标系,是一种纯RESTful的服务
- TMS和WMTS在本质上非常类似,基本上遵循的是同一种切片规则
# KML服务
KML 和 GML 在名称上类似,但是功能有很大不同。GML 主要用于地理数据的交换;而 KML 主要用于地理数据的可规化,它不仅包括地理数据的描述,还包括数据的符号化方式、用户规觇的控制等信息。
# 服务的加载方式
只能单个图层加载
http://gisserver.domain.com:6080/arcgis/rest/services/MapServer/7/query?
text=&geometry=&geometryType=esriGeometryEnvelope&inSR=&spatialRel=esriSpatialRelIntersects
&where=&returnGeometry=true&outSR=&outFields=&f=kmz
# 服务查看
- 查看图层信息:服务地址?f=pjson
- 查看服务类型:服务地址?f=pjson
supportedExtensions: WFSServer, WMSServer
- 查看能力信息:服务地址?request=GetCapabilities&service=WMS
http://127.0.0.1:6080/arcgis/rest/services/2022yingxiang/MapServer
//需要去掉rest
http://127.0.0.1:6080/arcgis/services/2022yingxiang/MapServer/WMSServer
- KML服务其 URL 遵循与以前相同的模式,但会以 generateKML.kmz 结尾
http://127.0.0.1:6080/arcgis/rest/services/2022yingxiang/MapServer/generateKML.kmz
http://127.0.0.1:6080/arcgis/rest/services/2022yingxiang/MapServer/0/generateKML.kmz
http://124.128.33.23:6080/arcgis/rest/services/2022yingxiang/MapServer/find/generateKML.kmz
# 服务查询
查询方法有三种:query、find、identify
- identify:根据图形或属性多图层查询
function identifyTask(geometry) {
//定义空间查询对象,注意他的参数是整个地图服务,而不是单个图层
let identifyTask = new IdentifyTask(BOUALayers.url);
//定义空间查询参数对象
let params = new IdentifyParameters();
//容差
params.tolerance = 5;
//是否返回几何信息
params.returnGeometry = true;
//空间查询的图层
params.layerIds = [0,1,2];
//空间查询的条件
params.layerOption = IdentifyParameters.LAYER_OPTION_ALL;
params.width = BOUALayers.fullExtent.width;
params.height = BOUALayers.fullExtent.height;
//空间查询的几何对象
params.geometry = geometry;
params.mapExtent = Layers.fullExtent;//map.extent;
//执行空间查询
identifyTask.execute(params).then(showQueryResult);
}
//查询85图层中objectid为1的数据,结果包含边界数据
http://xxx/arcgis/rest/services/my_layer/MapServer/identify?f=json&tolerance=5&returnGeometry=false&imageDisplay=1073,897,96&geometry={%22x%22:13095597.208668906,%22y%22:3709649.674951799}&geometryType=esriGeometryPoint&sr=102100&mapExtent=12937525.434175162,3602943.583465693,13265593.159575136,3877199.640952905&layers=all:77,74,73,52
- find:根据属性单层、多层查询
function findTask(LayerIds,searchFields,searchText,sr) {
//定义属性查询对象,注意他的参数是整个地图服务,而不是单个图层
let findTask=new FindTask(mapServiceUrl.BOUA);
//定义属性查询参数对象
let findParms=new FindParameters();
//是否返回几何信息
findParms.returnGeometry=true;
//属性查询的图层
findParms.layerIds=LayerIds;
//属性查询的字段
findParms.searchFields=searchFields;
//属性查询的关键字
findParms.searchText=searchText;
//执行属性查询
if(sr==='showResults'){
findTask.execute(findParms).then(showQueryResult);
}else if(sr==='removeResults'){
findTask.execute(findParms).then(removeQueryResult);
}
}
查询示例:
//模糊查询RNAME属性带有合字的数据,结果不包含边界数据
http://xxx/arcgis/rest/services/my_layer/MapServer/find?searchText=%E5%90%88&contains=true&searchFields=RNAME&sr=&layers=0%2C1%2C2%2C3%2C4%2C5&layerDefs=&returnGeometry=false&maxAllowableOffset=&geometryPrecision=&dynamicLayers=&returnZ=false&returnM=false&gdbVersion=&f=pjson
- query:根据图形或属性单图层查询
- intersects:相交
- contains:包含
- crosses:穿过
- envelope-intersects:图层视图中与查询几何相交
- overlaps:重叠
- touches:边界相交
- within:完全包含
- disjoint intersects:空间关系返回图层视图中不相交的要素
function SpatialQuery(layerUrl, queryGeom, spatialRelationship) {
let queryTask = new QueryTask({
url: layerUrl
});
let query = new Query();
query.geometry = queryGeom;
query.spatialRelationship = spatialRelationship;//default "intersects"
query.returnGeometry = true;
query.outFields = ["*"];
queryTask.execute(query).then(function (response) {
console.log(response.features);
});
}
//查询85图层中objectid为1的数据,结果包含边界数据
http://xxx/arcgis/rest/services/my_layer/MapServer/85/query?f=json&where=1=1&returnGeometry=true&spatialRel=esriSpatialRelIntersects&objectIds=1&outFields=*&outSR=102100
坐标点查询
图斑查询(四至)
这里每次都会忘记要怎么传 Geometry,这里记录一下
//geometryType=esriGeometryEnvelope(范围)
{xmin: -104, ymin: 35.6, xmax: -94.32, ymax: 41}
//geometryType=esriGeometryPoint(点的三种方式都可以)
-104,35.6
{x: -104, y: 35.6}
{ "x": -118.15, "y": 33.80, "spatialReference": { "wkid": 4326 } }
//esriGeometryMultipoint(多点)
{ "points": [ [ -97.06138, 32.837 ], [ -97.06133, 32.836 ], [ -97.06124, 32.834 ], [ -97.06127, 32.832 ] ], "spatialReference": { "wkid": 4326 } }
//esriGeometryPolyline
{ "paths": [ [ [-97.06138,32.837], [-97.06133,32.836], [-97.06124,32.834], [-97.06127,32.832] ], [ [-97.06326,32.759], [-97.06298,32.755] ] ], "spatialReference": {"wkid": 4326} }
//esriGeometryPolygon (面)
{ "rings": [ [ [-97.06138,32.837], [-97.06133,32.836], [-97.06124,32.834], [-97.06127,32.832], [-97.06138,32.837] ], [ [-97.06326,32.759], [-97.06298,32.755], [-97.06153,32.749], [-97.06326,32.759] ] ], "spatialReference": { "wkid": 4326 } }
{ "rings" : [ [ [ -96.929599633999942, 38.52426809800005 ], [ -96.929602437999961, 38.522448437000037 ], [ -96.92959118999994, 38.529723252000053 ], [ -96.929594022999936, 38.527905578000059 ], [ -96.929596839999988, 38.526087119000067 ], [ -96.929599633999942, 38.52426809800005 ] ] ] }
arcgis esriGeometryType的类型
private string ZHTTLX(esriGeometryType geotype)
{
string stype = geotype.ToString();
switch (geotype)
{
case esriGeometryType.esriGeometryAny:
stype = "任何类型(Any valid geometry)";
break;
case esriGeometryType.esriGeometryBag:
stype = "任意几何类型的集合(GeometryBag)";
break;
case esriGeometryType.esriGeometryBezier3Curve:
stype = "贝兹曲线(BezierCurve)";
break;
case esriGeometryType.esriGeometryCircularArc:
stype = "圆弧(CircularArc)";
break;
case esriGeometryType.esriGeometryEllipticArc:
stype = "椭圆弧(EllipticArc)";
break;
case esriGeometryType.esriGeometryEnvelope:
stype = "外包(Envelope)";
break;
case esriGeometryType.esriGeometryLine:
stype = "线段(Line)";
break;
case esriGeometryType.esriGeometryMultiPatch:
stype = "表面几何(MultiPatch)";
break;
case esriGeometryType.esriGeometryMultipoint:
stype = "多点(Multipoint)";
break;
case esriGeometryType.esriGeometryNull:
stype = "未知类型(Unknown)";
break;
case esriGeometryType.esriGeometryPath:
stype = "路径(Path)";
break;
case esriGeometryType.esriGeometryPoint:
stype = "点(Point)";
break;
case esriGeometryType.esriGeometryPolygon:
stype = "多边形(Polygon)";
break;
case esriGeometryType.esriGeometryPolyline:
stype = "多段线(Polyline)";
break;
case esriGeometryType.esriGeometryRay:
stype = "射线(Ray)";
break;
case esriGeometryType.esriGeometryRing:
stype = "环(Ring)";
break;
case esriGeometryType.esriGeometrySphere:
stype = "球体(Sphere)";
break;
case esriGeometryType.esriGeometryTriangleFan:
stype = "三角扇形(TriangleFan)";
break;
case esriGeometryType.esriGeometryTriangleStrip:
stype = "三角带(TriangleStrip)";
break;
case esriGeometryType.esriGeometryTriangles:
stype = "三角形(Triangles)";
break;
default:
break;
}
return stype;
}
# 查询上限1000的问题
打开ArcGIS Server找到自己发布的服务,右键Service Properties,左侧点击Parameters,右侧有一个Maximum number of records returned by the server,修改一下上限就行了,具体上限没有测试,5000没问题。
在服务中也可以看到
# 服务发布
地图服务是一种利用 ArcGIS 使地图可通过 Web 进行访问的方法。我们首先在 ArcMap 中制作地图,然后将地图作为服务发布到 ArcGIS Server 站点上。之后,Internet 用户便可在 Web 应用程序、ArcGIS for Desktop、ArcGIS Online 以及其他客户端应用程序中使用此地图服务。
我们常用的地图服务主要分为两种:动态地图服务,切片地图服务(也叫瓦片地图服务),地图服务其实可以理解为图层的集合。
# 动态地图服务的特点
- 动态地图会在用户发出请求时进行绘制。
- 地图服务具有允许客户端(例如 ArcGIS web API)动态更改每个图层的行为和外观。
- 可以执行属性查询,空间查询等相关功能。
# 发布WMS、WFS、REST、WMTS服务
- 把需要的图层拖到Table Of Contents中
- 点击File -> Share As -> Service 发布服务
- Public a Servce 如果第一次发布需要点击右侧+号添加连接
- Administrator GIS Sever
- Server URL:http://localhost:6080/arcgis,账号和密码为ArcGIS Server的账号和密码
- 配置服务名称gisdata:http://localhost:6080/arcgis/rest/services/sylone/gisdata/MapServer
- 第一次发布选择:Create new folder,也可以直接选择默认root目录,这样路径就少了一级
- Service Editor -> Cadhing
- 动态服务:Dynamically from the data
- 切片服务:Using tiles from a cache
- 先把实现创建的.xml文件导出进来。Tiling Scheme:A tiling scheme file
- 把事先创建的.xml文件导出进来后,根据自己需求选择等级:Levels of Detail
- 点击 Analyse,只要是低级就可以发布
- Data source is not registered with the server and data will be copied to the server 双击注册即可
- 点击 public 发布
- 查看地图服务:打开并登录服务管理器 http://localhost:6080/arcgis/manager/
# 发布GP服务
- 打开ArcCatalog软件,点击【Geoprocessing】-【ModelBuilder】,打开模型建构器
- 从【ArcToolbox】工具箱中,将需要的工具拖到模型构建器中
- 双击模型构建器中的工具,配置参数信息
- 模型构建完成后,点击【Model】-【Validate Entire Model】,验证模型。点击【Model】-【Run】,运行模型
- 在ArcMap中,打开运行生成的图层,检查运行结果。(此步可省略)
- 模型参数化,选择输入的图层,右键点击【Model Parameter】。模型参数化后,运行时可以使用默认值,也可以指定值
- 选择一个文件夹,右键点击【New】-【Toolbox】,新建工具箱
- 将构建完成的模型,保存到建好的工具箱中
- 设置环境,点击【Geoprocessing】-【Environments】,将【Workspace】-【Scratch Workspace】中的路径修改为模型保存的路径
- 双击建构的模型,检查参数信息,点击确定后自动运行模型,只有在正式环境运行成功的GP才能发布服务,在模型构建器中的运行为调试环境
- 点击【Geoprocessing】-【Results】,查找模型运行结果。选择模型,右键【Share As】-【Geoprocessing Service】,发布GP服务
- 在弹出的【Sevice Editor】界面上点击【Analyse】,分析服务
- 若出现问题,下面的【Prepare】会有提示
- 解决方法:填写参数注释
- 在弹出的【Sevice Editor】界面上点击【Publish】,发布服务
- 在ArcCatalog的目录树中可以看到已发布的GP服务
- 在服务管理页面中,打开发布的GP服务,点到【功能】,进入【URL REST】列的网址
- 点击【GPModel】 -> 点击【Submit Job】-> 点击【Submit Job(GET)】按钮
- 点击【Check Job Details Again】 -> 点击查看运行结果