写在前面
前一段时间做ArcGIS 的javascript开发,对arcgis的服务概念比较混乱,只记得当时使用arcgis pro直接发布要素服务,然后基于javascript开发就够了,但是arcgis pro是portal托管服务,你不需要自己的arcgis server服务器就能发布,好处是方便,坏处是真恶心人,过几天就不给用了,不能公开访问,必须要登录账号,而且最恶心人的是什么,我为了买它800块一年的Arcghis pro服务,特地办了visa信用卡,结果后面买了好几次没有买成功,还冻结信用卡余额,冻结了一个多月,真是把人恶心惨了。ESRI ESRI ESRI!
还有更恶心人的事情,我在淘宝上找商家教我一下,就简单说一下Feature Server的发布过程,然后叫他帮我暂时发布一下服务,我说给200,他先说好,后面又说要我500,不是!就简单动动手花个半个小时就搞定的事情,要坑我500???我特么、、、我真被搞无语了,淘宝店家叫"水信科技"。
还想吐槽的是,网上真没有人遇到我这样的情况吗?压根没有人简单地阐述如何在ArcGIS Server中发布FeatureServer,ESRI官方文档也是反人类,说不明白。今天我就把这价值500元的教程免费发出来,我就不信这个世道只有利益至上吗?我就是要做好事。
背景
- 为了方便MapsSDK for javascript开发,需要发布FeatureServer服务在本地服务器上,脱离Arcgis online这个恶心包。
目的
- 将ArcGIS pro的arpx项目作为要素服务(Feature Server),发布在ArcGIS Server上。
- 最终效果:
材料
- ArcGIS Server(10.8.1 (内部版本 14362))
- ArcMap 10.8.1(这个有重要作用)
- ArcGIS Pro 3.1
- Postgresql 12.x(不要用9也不要用17版,其他版本不知道,反正Arcgis软件里面默认只支持9-12的版本)
此外,还要准备两个地方的文件,拷贝出来备用:
- keycodes,启用企业级地理数据库要用。(ArcGIS Server服务器上的授权文件)
- st_geometry.dll用于postgresql支持企业级地理数据库扩展。(ArcGIS Server服务器上的)
位置:
- C:\Program Files\ESRI\License10.8\sysgen
- C:\Program Files\ArcGIS\Server\DatabaseSupport\PostgreSQL\12\Windows64
过程
一、软件安装及文件准备
这些软件都可以安装在同一台机器上,也可以不在同一台机器上,推荐pg数据库与arcgis server安装同一台电脑上。
-
ArcGIS Pro安装,略(https://pan.baidu.com/s/1u1CrFUygQDYK3EZKNpj43w?pwd=bkw4 提取码: bkw4)
-
ArcGIS Server安装,略(https://pan.baidu.com/s/1EMYRIpNiVO1IV-tty49bkg?pwd=aazn 提取码: aazn)
-
ArcMap安装,略(https://pan.baidu.com/s/1EMYRIpNiVO1IV-tty49bkg?pwd=aazn 提取码: aazn)
-
Postgresql安装,记得装12,略(https://www.enterprisedb.com/downloads/postgres-postgresql-downloads)
-
Postgresql配置
首先将上面提到的st_ge0metry.dll和pgsqlengine.dll拷贝到postgresql安装目录下的lib目录下,然后配置一下\PostgreSQL\12\data目录下的pg_hba.conf在最后一行加上(直接复制,空格个数无所谓):host all all 0.0.0.0/0 md5
还没完成,还要使用pgadmin连接本地postresql,创建一个数据库,然后创建一个新的用户sde,arcgis中不能使用默认的postgres用户,不然启用企业级地理数据库时会报错。
↑创建数据库,使用template1
↓创建用户sde,一定要赋予所有权限
二、在ArcMap中连接并生成.sde数据库并启用企业级地理数据库
这里需要说明一下是什么意思。我们经常接触的地理数据库是.gdb,我们通常将raster或者shp等文件存在gdb数据库中,sde也是和gdb一个意思,只不过他是基于关系数据库的(postgresql或者sql server、oracle等),而gdb直接存在文件中。而它发布要素服务必须要是所有的图层的源都是存在sde数据库中的,所以我们需要sde数据库才能发布featureServer。如果你的项目是基于gdb或者直接从磁盘中加载的shp的话,也不要担心,只需要将shp导入sde,然后在图层属性中设置一下数据源就成功切换到sde了的,很简单,可以无损切换。
为什么要用ArcMap来生成sde而不用ArcGIS Pro呢?其实我最先开始就是ArcGIS Pro中连接pg数据库并启用企业级地理数据库的,但是遇到了很多问题,比如:
- 在连接pg数据库时,他给我显示一个Server=;Port=5432,我以为只需要在=后面输入localhost就行了,结果怎么都连不上,还换了几个版本的pg数据库,最后在网上搜索发现只需要删掉这一行的内容,只输入localhost就能连接了,我只能说ESRI你tm煞笔zz吧?故意误导人,气煞了。
- 执行启用企业级地理数据库时,选了sde,填写了keycodes文件,然后出现st_geometry库ArcGIS版本与使用的预期版本不匹配 。
记住,如果不启用企业级地理数据库的话,shp文件是导入不进去的。
最后不得已在ArcMap10.8中启用,然后成功了。
启用过程暂时略吧,反正就是在arcmap中创建数据库连接,选择postgresql然后连接,最后在连接的sde数据库上右键点击启用企业地理数据库,然后要选择前面说到的keycodes文件,等一会儿就启用成功了,他会在postgresql中创建很多数据库表。
三、在ArcGIS Server上注册sde数据库
为什么要在ArcGIS Server上注册sde数据库?因为我也不知道,反正你不注册上服务器的话,服务器也拿不到数据库里面的数据,就无法发布成功。我的猜测是:
因为你把shp数据放入sde数据库后,它就变成了featrure class要素类,这是真正的数据,你在arcgis pro中发布要素服务时,只是将服务定义传到arcgis server,真正的数据在sde数据库中,服务器要想从数据库中去获取要素类数据,就必须从数据库中去拿,所以要注册到服务器上。
在浏览器中打开arcgis server manager站点,导航到站点-GIS服务器-数据存储-数据库,然后导入xxx.sde数据库。
四、ArcGIS Pro连接sde数据库并导入shp变成要素类
- 在三中,我们在ArcMap中创建sde数据库并启用了企业级地理数据库,然后我们回过头来在ArcGIS Pro中连接这个sde数据库,并在数据库上右键点击,导入各个shp文件:
看,这就是导入的fearture class要素类们了
然后,在arpx项目中,对图层设置源,切换到要素类:
至此,把所有图层都切换到要素类后,就可以发布了。
五、发布要素服务
- 首先要在ArcGIS Pro中连接ArcGIS Server服务器,我的ArcGIS Pro和Server都是安装在同一个虚拟机中的,连接后如图:
- 在服务器上右键选择发布,然后选择地图服务,选择如图,里面是空的无所谓,然后确定即可。
- 输入名称,选择注册数据库,如果选择复制所有数据,就不能发布要素服务
- 在配置中勾选要素
- 点击分析,看有没有什么错误,如果没有错误就直接发布,如果有错误就解决,我在发布中遇到两个问题:
- 第一个问题是该图层的数据源不对,意思是图层的源可能是存在gdb中的图层或者磁盘文件夹中的矢量图层等,只需要导入启用了企业级地理数据库的sde数据库并切换源即可。
- 第二个问题是啥忘记了,反正点后面那个三个点就自动解决了。
结论
总结
至此,500元的教程已经免费贡献给大家了,同时还提供了免费的售后支持,有问题大家可以加入q群565316938(学术资源分享群),有什么问题咨询群主就是了,只为相互学习,分享才能让大家一起快乐,我从来不反对知识变现,但我讨厌仗着有点技术,就觉得自己天下无敌,坑害同仁的,我鄙视。