发布到并托管于您的门户的切片图层支持使用一组预先绘制的地图影像或切片实现大型数据集的快速可视化。 托管切片为业务图层提供了可参考的地理环境。例如,可包含一个您所在社区的街道的切片以便为要素图层中的街道符号提供图形参考。
您可使用以下任意一种方法发布将在您的门户上托管的切片图层:
- 在 ArcMap 中定义地图,并允许您的门户创建切片。
- 在 ArcGIS Pro 中定义地图,并允许您的门户创建切片。
- 在 ArcMap 中构建并共享切片包,然后在您的门户中发布。
- 在 ArcGIS Pro 中构建切片包,然后上传并发布到您的门户。
- 为现有托管要素图层创建切片。
- 在 ArcMap 中定义服务定义文件,将其上传,并允许您的门户创建切片。
可以在发布时在切片上自动构建缓存,或在发布后手动构建缓存。有关详细信息,请参阅切片缓存的最佳做法。
要将地图或服务定义文件作为托管切片图层发布,您必须具备创建内容和发布托管切片图层的权限。
在 ArcMap 中定义并发布地图
在 ArcMap 中,您可以发布要在门户中进行托管的切片图层。
请确保启动 ArcGIS Desktop 前 ArcMap 已连接到您的门户。
- 启动 ArcMap 并打开您希望发布的地图。
- 使用具有创建内容和发布托管切片图层的权限的组织帐户登录您的门户。
- 单击文件 > 登录。
- 输入您的门户用户名和密码,然后单击登录。
- 单击文件 > 共享为 > 服务。
- 选择发布服务,然后单击下一步。
警告:
如果选择改为覆盖服务,则现有地图切片项目将从门户中删除,并会创建一个具有相同名称的新项目。 新项目创建于根文件夹中并会分配得到一个新 ID。您必须重新配置共享,如有必要,请将项目移回到重新发布前其所在的文件夹。
- 在连接类型的下拉列表中,选择我的托管服务。然后输入切片名称并单击继续。
- 在服务编辑器中设置所需属性。此处,您可以选择用户可对切片执行的操作,还可以精细控制服务器显示切片的方式。
- 在服务编辑器的左侧窗格中,单击功能,然后选中切片地图将地图显示为切片图层。如果希望在将图层添加到地图查看器时为图层配置弹出窗口,请选中要素访问来发布包含切片的要素图层。
可单击服务编辑器左侧窗格中的子项切片绘制来设置与客户端发布的切片图层操作相关的高级属性。
- 单击缓存项目设置切片缓存的属性。有关详细步骤,请参阅 ArcGIS Server 帮助中的创建地图缓存。请注意,一些高级缓存设置仅在直接向 ArcGIS Server 发布时适用。
- 在服务编辑器的左侧窗格中,单击项目描述并提供切片图层的摘要和标签。您需要先输入此信息,然后才能进行发布。有关详细信息,请参阅 ArcGIS Server 帮助中的设置地图服务属性的项目描述部分。
- 在服务编辑器的左侧窗格中,单击共享,然后选择共享托管切片图层的对象。默认情况下,您的托管切片图层仅与我的内容共享,即,只有您可以访问。您的切片图层通常将在我的内容中可见,但您也可以选择与所有人、组织成员或仅特定群组的成员共享服务。
- 在服务编辑器中,单击分析 。
该操作会对地图进行检查,确定能否将其发布。必须先在准备窗口中修复错误 才能进行发布。另外,您还可以修复警告和通知消息,以进一步完善所发布切片的性能和外观。有关解决这些问题的详细信息,请参阅 ArcGIS Server 帮助中的分析 GIS 资源。
- 还可以单击服务编辑器中的预览 。这样您便可以了解在 Web 上查看切片图层时切片图层的外观。
- 修复错误以及警告和消息(可选)后,单击发布 。
注:
此时会将您的数据复制到服务器。数据大小以及网络连接速度和带宽会影响发布过程所花费的时间。 还应留出生成切片所需的时间。
在您门户上发布切片图层后,可在目录窗口中展开我的托管服务节点进行查看。
托管切片图层在门户网站的我的内容页面中列为两个独立的项目:“切片”和“服务定义”。服务定义是一个压缩文件,内含地图、地图数据以及如何发布切片的详细信息。服务定义可传输并发布至任何运行 ArcGIS Server 的计算机上。
在 ArcGIS Pro 中定义并发布地图
通过 ArcGIS Pro 中的地图,您可以发布要在门户中托管的切片图层。
另请注意,Web 浏览器无法显示您在制作地图时最初可能使用的某些较为复杂的制图符号。大多数符号类型均可用,但在某些情况下,符号会在发布时降级。有关受支持符号的详细信息,请参阅 ArcGIS Server 帮助中的创作要素服务,并在发布前对地图符号进行所需更改。
- 开启 ArcGIS Pro 并打开包含要发布的地图的工程。
- 请确保您的门户连接处于活动状态,且您已使用具有创建内容和发布托管切片图层权限的帐户登录到您的组织。
- 要发布切片图层,请执行以下操作之一:
- 在内容窗格中选择这些图层。右键单击选择集,然后单击共享为 Web 图层。
要在地图中发布所有图层,请在共享选项卡的共享为组中单击 Web 图层,然后单击发布 Web 图层。
提示:
如果共享为 Web 图层菜单选项未激活,则可能由下列某一原因导致:
- 登录时所使用的帐户不具有发布托管图层的权限。
- 您的门户未对托管 Web 图层所需的托管服务器进行配置。
- 正在尝试发布不受支持的多面体图层。
- 输入切片图层的名称。图层默认保存到我的内容中。您可以通过输入文件夹名称或浏览已有的文件夹将图层保存到我的内容的文件夹中。
- 选择复制所有数据。
- 在图层类型中选择切片。
这样会自动取消选中其他图层类型选项,因为复制数据时仅可选中一个选项。
- 提供切片图层的摘要和标签。
- 指定如何共享切片图层。发布的所有图层都会自动共享到您的组织内的个人工作空间中(我的内容)。其他人无法访问您的内容,除非您在以下一项或多项中共享您的内容:
- 门户的名称 - 选择此选项可允许组织中所有经过身份验证的用户共享此图层。
- 任何人 - 选择该选项可使图层向具有您门户访问权限的任何人开放。
- 群组 - 您可以与您所在群组的成员共享图层。
- 单击配置,然后单击配置 Web 图层属性按钮以指定缓存设置。
- 选择切片方案。
- 调整并拖拽细节层次条块来为您的切片图层指示最小和最大比例。
在您更改最小和最大比例时,生成缓存的估计大小会发生改变。
- 选择构建切片缓存的时间和位置。
- 在发布图层时,如果您希望在门户的托管服务器上构建切片,请选择在服务器上自动缓存。
- 如果要在门户的托管服务器上构建和存储缓存,但您希望在发布后自己构建缓存,请选择在服务器上手动缓存,在发布图层后在门户网站中打开切片图层,然后手动创建缓存。
- 如果想要在 ArcGIS Pro 计算机上构建并打包缓存,请选择本地缓存,然后在 ArcGIS Pro 计算机上指定一个位置以存储临时切片包。切片包将自动上传到门户的托管服务器以进行解包,并将缓存存储在此。
- 要允许用户下载地图切片以供离线使用,请选中允许客户端导出缓存切片。
- 如果选中了允许客户端导出缓存切片,请使用导出限制为字段指定客户端一次可离线使用的最大切片数量。
- 请单击内容选项卡来确认切片图层将会包含您所需的数据图层。
- 请单击分析来检查错误或故障。
如果发现故障,会将它们列于消息选项卡中。右键单击每条消息以获取详细信息,阅读错误或警告帮助,然后获取建议的修复方法。在发布前必须修复错误。另外,还可以修复警告,从而进一步完善托管切片图层的性能和外观。
- 解决错误和某些警告后,单击发布 。
注:
此时会将您的数据复制到服务器。数据大小以及网络速度和带宽会影响发布过程所花费的时间。
当完成发布时,您可以单击管理 web 图层以打开门户网站。
在 ArcMap 中构建并共享切片包,然后发布
利用 ArcMap 可以为地图文档构建切片并将其存储在易于传输的切片包 (.tpk) 文件中。您可以在 ArcMap 中创建切片包,将其共享到您的门户,并将其作为托管切片图层进行发布。
下面介绍了两种不同的工作流。第一种工作流可用于小型至中型切片包,并且从切片包中发布切片时将保留地图文档的元素(如图例和文本元素)。当发布大型切片包时推荐使用第二种工作流,但从切片包中发布切片时仅保留数据。
请按照以下步骤发布小型至中型切片包:
- 在 ArcMap 中打开地图。
- 使用具有创建内容和发布托管切片图层的权限的组织帐户登录您的门户。
- 单击自定义 > ArcMap 选项 > 共享并确保启用 ArcGIS Runtime 工具已选中。
这样即可启用您将在下一步中用到的菜单选项。
- 在 ArcMap 中,单击文件 > 共享为 > 切片包。
- 配置下列子步骤中的所有设置。其余设置可由您自行选择配置。
- 在切片包选项卡上,选择将包上传到我的 ArcGIS 门户帐户。
- 在切片格式选项卡上,选择 ArcGIS Online/Bing 地图/Google 地图作为切片方案。
- 在项目描述选项卡上,提供标记为必填的项目。
- 在共享选项卡上,可以选择与公众或特定的群组共享包。
- 单击共享。
系统可能会提示您在创建切片包之前保存地图。
生成切片包可能需要一些时间,尤其是在包括较大比例的情况下。
- 切片包生成完成后,使用在 ArcMap 中创建切片包时所用的同一帐户登录您的门户,然后单击我的内容。
- 单击切片包以显示其项目详细信息页面。
- 单击发布。
- 输入标题和标签,然后单击发布
切片已解包,且已在您的门户中创建托管切片图层。您将能够在我的内容中看到该地图切片。
要构建并共享大型切片包,Esri 建议您使用切片缓存工具集代替上述工作流。这些工具能够利用多个处理核心。
按以下顺序执行上述工具。
- 运行生成切片缓存切片方案定义切片格网和图像格式。
- 运行管理切片缓存构建切片。
- 运行导出切片缓存创建切片包。
- 运行共享包(位于打包工具集中)将切片上传至您的门户。
请注意,如果希望配置弹出窗口,则必须指定包含托管切片图层的要素图层。
在 ArcGIS Pro 中构建切片包,然后将其上传到您的组织
使用创建地图切片包地理处理工具来创建切片包、将包添加到您的组织并发布切片图层。
切片已解包,且已在您的门户中创建托管切片图层。您将能够在我的内容中看到该地图切片和切片包。
从托管要素图层发布
如果您的门户托管服务器使用通过 ArcGIS Data Store 创建的关系数据存储,您可以使用当前拥有的托管要素图层向您的门户发布托管切片图层。 对于可视化大型数据集来说,这是非常有用的工作流。
注:
- 对托管要素图层所做的空间属性编辑不会自动反映在托管切片图层中。必须从更新后的托管要素图层中重新发布托管切片图层。
- 托管要素图层上存在可能阻止您发布托管切片图层的样式化限制。
- 您不能通过多面体或点云托管要素图层发布托管切片图层。
要从托管要素图层发布托管切片图层,请按照以下步骤操作:
- 使用具有发布托管切片图层权限的帐户进行登录,然后单击我的内容。
- 要进行发布,请执行下列步骤之一:
- 单击想要发布的托管要素图层并单击发布。
- 单击创建 > 切片图层,并选择作为切片发布的要素图层。
- 输入托管切片图层的标题、标签和摘要,并选择一个文件夹。
- 或者,通过拖动可视范围端点更改图层的显示范围。
警告:
Portal for ArcGIS 会显示建议的比例范围,但您可以对其进行修改。但请注意,如在比例范围中包含大比例,则会使服务器消耗的资源大幅增加。请不要创建超出数据精度的切片。
- 单击确定。
将创建托管切片图层,并显示其项目页面。
从服务定义文件发布
发布切片和构建缓存会消耗大量的服务器资源。如果需要发布大量切片图层,您的地图创建者可以在 ArcMap 中创建服务定义 (.sd) 文件,定义文件中包含向门户发布切片图层所需的所有信息。然后可以在工作时间后使用脚本向您的门户上传和发布服务定义文件。生成的切片图层将在您的门户托管服务器上进行托管。
创建服务定义文件
地图创建者应遵循以下步骤创建包含将托管于门户中的切片图层所需的数据和符号的服务定义文件。
- 启动 ArcMap,然后登录到门户。
- 创建和保存地图。
有关创建和发布地图的信息,请参阅 ArcGIS Server 帮助中的地图服务主题。
- 单击文件 > 共享为 > 服务。
- 选择保存为服务定义文件,然后单击下一步。
- 单击选择连接,然后从下拉列表中选择我的托管服务。
- 输入文件名称并单击下一步。
- 在您的客户端计算机上指定将在哪个目录中创建服务定义文件,然后单击继续。
随即打开服务编辑器。
- 在服务编辑器的左侧窗格中单击缓存。
- 选择切片方案。
- 选择切片的最小比例和最大比例,然后选择计算缓存大小。
- 单击发布服务后,手动构建缓存。
- 或者,单击高级设置并为切片缓存设置其他缓存设置。
- 在服务编辑器的左侧窗格中,单击项目描述并提供切片图层的信息。
创建服务定义文件前必须提供至少一个摘要和标签。
- 单击分析 以确保不存在任何错误。
您必须修复错误,然后才能过渡服务定义文件。也可以对返回的警告和消息进行修正。
- 修复错误以及警告和消息(可选)后,单击过渡 。
服务定义文件保存在您指定的位置。
加载服务定义并发布
从创建者处获取服务定义文件后,可将其手动上传到您门户中的我的内容页面并发布切片图层,或者计划使用脚本来上传和发布该文件。
手动上传和发布
登录到门户网站来向您的门户添加和发布服务定义文件。
- 以具有创建内容和发布托管切片图层权限的成员身份登录到您的门户,然后打开我的内容。
- 单击添加项目。
- 选择从您的计算机加载文件。
- 单击“浏览”按钮,然后选择服务定义文件。
- 选中将文件发布为服务。
- 输入标签术语,并以逗号分隔。
标签是用于描述项目的词语或短语,可提高项目被找到的几率。Federal land将被视为一个标签,而 Federal,land则被视为两个标签。
- 单击添加项目添加服务定义文件并发布切片图层。
切片图层发布到您的门户托管服务器,而且服务定义和切片都添加到我的内容中。
- 发布切片图层后,您可选择开始构建切片。单击链接创建切片。
默认情况下,只有您有权访问服务定义文件和托管切片图层。您可以在您的组织或指定群组中与他人共享文件和切片。
运行脚本来上传和发布
要在几小时后上传并发布服务定义文件,可自动执行以下脚本以在您的 GIS Server 计算机上运行它们:
- 将以下的脚本复制到文本文件并通过 .py 扩展名保存文件。
import os, sys, json, urllib, urllib2, httplib, urlparse, mimetools, mimetypes from cStringIO import StringIO # generates a new token from Portal def generate_token(baseurl, username, password): tokenUrl = urlparse.urljoin(baseurl, 'sharing/generateToken') postdata = { 'username': username, 'password': password, 'client': 'requestip', 'expiration': 60, 'f': 'json' } encoded_postdata = urllib.urlencode(postdata) opener = urllib2.build_opener() try: resp = opener.open(tokenUrl, data=encoded_postdata) except urllib2.HTTPError as e: raise Exception('Unable to connect to Portal, please check the url: {} {}'.format(e.code, e.reason)) resp_json = json.loads(resp.read()) if 'error' in resp_json: raise Exception('\n'.join(resp_json['error']['details'])) return resp_json['token'] sys.exit(1) # create proper multi-part POST request data def _encode_multipart_formdata(fields, files): boundary = mimetools.choose_boundary() buf = StringIO() for (key, value) in fields.iteritems(): buf.write('--%s\r\n' % boundary) buf.write('Content-Disposition: form-data; name="%s"' % key) buf.write('\r\n\r\n%s\r\n' % str(value)) for (key, filepath, filename) in files: buf.write('--%s\r\n' % boundary) buf.write('Content-Disposition: form-data; name="%s"; filename="%s"\r\n' % (key, filename)) buf.write('Content-Type: %s\r\n' % (mimetypes.guess_type(filename)[0] or 'application/octet-stream')) f = open(filepath, "rb") try: buf.write('\r\n' + f.read() + '\r\n') finally: f.close() buf.write('--' + boundary + '--\r\n\r\n') buf = buf.getvalue() return boundary, buf # send multi-part POST request def _postmultipart(host, selector, fields, files, ssl): boundary, body = _encode_multipart_formdata(fields, files) headers = { 'Content-Type': 'multipart/form-data; boundary={0}'.format(boundary) } if ssl: h = httplib.HTTPSConnection(host) else: h = httplib.HTTPConnection(host) h.request('POST', selector, body, headers) resp = h.getresponse() return resp.read() # first upload the SD file and create an item in Portal def addSDItem(baseurl, user, token, title, file, folder = ''): addUrl = 'sharing/rest/content/users/{}/{}addItem' if folder != '': addUrl = addUrl.format(user, folder + '/') else: addUrl = addUrl.format(user, '') url = urlparse.urljoin(baseurl, addUrl) files = [('file', file, os.path.split(file)[1])] fields = { 'token' : token, 'f' : 'json', 'type' : 'Service Definition', 'title' : title, 'tags' : 'sampletag', 'name': title, 'typeKeywords' : 'Data, Service Definition, ArcGIS, sd' } ssl = url.startswith('https://') parsed_url = urlparse.urlparse(url) print('Uploading {} to {}..'.format(file, baseurl)) resp = _postmultipart(parsed_url.netloc, str(parsed_url.path), fields, files, ssl) resp_json = json.loads(resp) if 'error' in resp_json: raise Exception('Unable to upload file {}: {}'.format(file, resp_json['error']['message'])) return resp_json['id'] # second publish the uploaded SD item as a new tiled service def publishTiles(baseurl, user, token, itemid): publishUrl = urlparse.urljoin(baseurl, 'sharing/rest/content/users/{}/publish'.format(user)) query_dict= { 'f' : 'json', 'token': token, 'itemid': itemid, 'buildInitialCache' : True, 'publishParameters' : { 'name' : 'cities' }, 'fileType': 'serviceDefinition' } query_string = urllib.urlencode(query_dict) print('Publishing tile service from item..') response = urllib.urlopen(publishUrl, query_string) resp_json = json.loads(response.read()) if 'error' in resp_json: raise Exception('Unable to publish item: {}'.format(resp_json['error']['message'])) # read input from command line when run as a standalone script if __name__ == '__main__': try: url = sys.argv[1] user = sys.argv[2] password = sys.argv[3] f = sys.argv[4] title = sys.argv[5] if not url.endswith('/'): url += '/' # make sure the url ends with / except: # if too few parameters are passed on command line, show usage help print('Usage: ') print(' publishServiceItem.py [portalUrl] [userName] [password] [sdFilePath] [titleOfServiceItem]') print('') print('portalUrl The secure url to the portal, e.g. https://portalmachine.example.com/arcgis/') print('userName The username of a user to publish the service.') print(' This user must have the required publishing privileges.') print('password The password of the user') print('sdFilePath Path to the .sd file containing the service definition') print(' E.g. c:\\temp\cachedService.sd') print('titleOfServiceItem The title to assign to the published item in the portal.') sys.exit(1) token = generate_token(url, user, password) id = addSDItem(url, user, token, title, f) publishTiles(url, user, token, id) print('Publishing complete. Tile generation has been started and may take a while to finish.')
- 创建您计划用来运行 Python 脚本的批量文件或 shell 脚本。
- 在文件中,调用 Python 脚本并提供针对您的站点的选项。
例如,要运行 publishServiceItem.py 脚本,在您的门户内键入 URL、连接使用的用户名、用户密码、服务定义文件的路径和创建服务的标题。在这个示例中,门户 URL 为 https://portal.domain.com/arcgis/,用户名和密码为 pub1 和 pub.1,服务定义文件的路径为 C:\maps\SDs\mymap.sd,服务名称为 studytiles。
publishServiceItem.py https://portal.domain.com/arcgis/ pub1 pub.1 C:\maps\SDs\mymap.sd studytiles
提示:
或者,您可以使用以下的简化脚本来将服务定义文件上传到您的门户、发布切片图层和构建缓存。但是,您必须安装其他 Python 包 - PortalPy 和 Python 请求 - 来运行此脚本。PortalPy 随 Portal for ArcGIS 一同安装。请参阅在 Portal for ArcGIS 帮助中的使用 PortalPy 为管理任务编写脚本以获取更多有关安装和使用该模块的详细信息。
import portalpy, requests, urlparse, sys, os # first upload the SD file and create an item in Portal def addSDItem(baseurl, user, token, title, file, folder = ''): addUrl = 'sharing/rest/content/users/{}/{}addItem' if folder != '': addUrl = addUrl.format(user, folder + '/') else: addUrl = addUrl.format(user, '') url = urlparse.urljoin(baseurl, addUrl) files = { 'file' : (os.path.split(file)[1], open(file, 'rb')) } fields = { 'token' : token, 'f' : 'json', 'type' : 'Service Definition', 'title' : title, 'tags' : 'sampletag', 'name': title, 'typeKeywords' : 'Data, Service Definition, ArcGIS, sd' } print('Uploading {} to {}..'.format(file, baseurl)) # send POST with upload request # verify=False turns off SSL cert validation, turn on for production environments with CA-signed certs resp = requests.post(url, data=fields, files=files, verify=False) resp_json = resp.json() if 'error' in resp_json: raise Exception('Unable to upload file {}: {}'.format(file, resp_json['error']['message'])) return resp_json['id'] # second publish the uploaded SD item as a new tiled service def publishTiles(baseurl, user, token, itemid): publishUrl = urlparse.urljoin(baseurl, 'sharing/rest/content/users/{}/publish'.format(user)) query_dict= { 'f' : 'json', 'token': token, 'itemid': itemid, 'buildInitialCache' : True, 'publishParameters' : "{ 'name' : 'cities' }", 'fileType': 'serviceDefinition' } print('Publishing tile service from item..') # send POST with publish request # verify=False turns off SSL cert validation, turn on for production environments with CA-signed certs response = requests.post(publishUrl, data=query_dict, verify=False) resp_json = response.json() if 'error' in resp_json: raise Exception('Unable to publish item: {}'.format(resp_json['error']['message'])) # read input from command line when run as a standalone script if __name__ == '__main__': try: url = sys.argv[1] user = sys.argv[2] password = sys.argv[3] f = sys.argv[4] title = sys.argv[5] if not url.endswith('/'): url += '/' # make sure the url ends with / except: # if too few parameters are passed on command line, show usage help print('Usage: ') print(' publishServiceItem.py [portalUrl] [userName] [password] [sdFilePath] [titleOfServiceItem]') print('') print('portalUrl The secure url to the portal, e.g. https://portalmachine.example.com/arcgis/') print('userName The username of a user to publish the service.') print(' This user must have the required publishing privileges.') print('password The password of the user') print('sdFilePath Path to the .sd file containing the service definition') print(' E.g. c:\\temp\cachedService.sd') print('titleOfServiceItem The title to assign to the published item in the portal.') sys.exit(1) portal = portalpy.Portal(url, user, password) token = portal.generate_token(user, password) id = addSDItem(url, user, token, title, f) publishTiles(url, user, token, id) print('Publishing complete. Tile generation has been started and may take a while to finish.')
- 在您的门户内存最低时,计划要运行的脚本。
请参阅 ArcGIS 地理处理帮助中的将 Python 脚本计划为在预定时间运行以获取更多有关计划脚本的详细信息。