Skip To Content

发布切片

在本主题中

发布并托管于您的门户的切片支持使用一组预先绘制的地图影像或切片实现大型数据集的快速可视化。 托管切片为业务图层提供了可参考的地理环境。例如,可包含一个您所在社区的街道的切片以便为要素图层中的街道符号提供图形参考。

可以通过将在您的门户中进行托管的服务定义文件或 ArcMap 文档发布切片。

可以选择是在发布时在切片上自动构建缓存,还是在发布后手动构建缓存。有关详细信息,请参阅切片缓存的最佳做法

要将地图或服务定义文件作为托管切片图层发布,您必须具备创建内容和发布托管切片图层的权限

在 ArcMap 中定义并发布地图

在 ArcMap 中,您可以发布要在门户中托管的切片。

请确保启动 ArcMap 前 ArcGIS for Desktop 已连接到您的门户。

  1. 启动 ArcMap 并打开您希望发布的地图。
  2. 使用具有创建内容和发布托管切片图层权限的帐户登录您的门户。
    1. 完成授权过程之后,单击 文件 > 登录
    2. 输入您的门户的用户名和密码并单击登录
  3. 现在,发布地图。
  4. 完成授权过程之后,单击 文件 > 共享为 > 服务
  5. 选择发布服务,然后单击下一步
    警告:

    如果选择覆盖服务,将从门户中删除现有地图切片项目,然后再以相同名称创建一个新项目。 新项目创建于根文件夹中并会分配得到一个新 ID。 您必须重新配置共享,如有必要,请将项目移回到重新发布前其所在的文件夹。

  6. 在连接类型的下拉列表中,选择我的托管服务。 然后输入切片名称并单击继续
  7. 服务编辑器中设置所需属性。 此处,您可以选择用户可对切片执行的操作,还可以精细控制服务器显示切片的方式。

    有关如何实现切片的最佳配置以进行部署的信息,请参阅 ArcGIS for Server 帮助中的调整和配置服务。 该主题中所引述的一些属性仅适用于 ArcGIS for Server,在使用托管切片图层时不适用。

    提示:

    如果在此会话期间关闭了服务编辑器,程序会提示您将作品保存为草稿服务。 草稿服务使您能够在以后返回到该界面以继续完成服务配置工作。默认情况下,草稿服务保存在“我的托管地图”连接的草稿文件夹中。 有关详细信息,请参阅 ArcGIS for Server 帮助中的关于草稿服务

  8. 您还需要设置几个托管切片图层所特有的属性。以下步骤详细介绍了这些操作。
  9. 服务编辑器的左侧窗格中,单击功能,然后选中切片地图将地图显示为切片图层。 如果希望在将图层添加到地图查看器时为图层配置弹出窗口,请选中要素访问来发布包含切片的要素图层。

    可单击服务编辑器左侧窗格中的子项切片绘制来设置与客户端发布的切片图层操作相关的高级属性。

  10. 单击缓存项目设置切片缓存的属性。 有关详细步骤,请参阅 ArcGIS for Server 帮助中的创建地图缓存。请注意,一些高级缓存设置仅在直接向 ArcGIS for Server 发布时适用。
  11. 服务编辑器的左侧窗格中,单击项目描述并输入切片图层的摘要和标签。 您需要先输入此信息,然后才能进行发布。有关详细信息,请参阅 ArcGIS for Server 帮助中的设置地图服务属性的项目描述部分。
  12. 服务编辑器的左侧窗格中,单击共享,然后选择共享托管切片图层的对象。 默认情况下,您的托管切片图层仅与我的内容共享,即,只有您可以访问。 您的切片图层通常将在我的内容中可见,但您也可以选择与所有人、组织成员或仅特定组的成员共享服务。
  13. 服务编辑器中,单击分析 分析

    该操作会对地图进行检查,确定能否将其发布。在进行发布前,必须先修复错误 错误 (在准备窗口中)。 另外,您还可以修复警告和通知消息,以进一步完善所发布切片的性能和外观。有关解决这些问题的详细信息,请参阅 ArcGIS for Server 帮助中的分析 GIS 资源

  14. 也可以单击预览 预览 (在服务编辑器中)。 这样您便可以了解在 Web 上查看切片图层时切片图层的外观。
  15. 修复错误以及警告和消息(可选)后,单击发布 发布
    注:

    此时会将您的数据复制到服务器。数据大小以及网络连接速度和带宽会影响发布过程需要的时间。 还应留出生成切片所需的时间。

在您门户上发布切片后,可在目录窗口中展开我的托管服务节点进行查看。

托管切片图层在门户网站的我的内容页面中列为两个独立的项目:“切片”和“服务定义”。 服务定义是一个压缩文件,内含地图、地图数据以及如何发布切片的详细信息。服务定义可传输并发布至任何运行 ArcGIS for Server 的计算机上。

在 ArcMap Pro 中定义并发布地图

在 ArcGIS Pro 的地图中,您可以发布要在门户中托管的切片。

请确认您的门户连接处于活动状态,然后再继续。

另请注意,Web 浏览器无法显示您在制作地图时最初可能使用的某些较为复杂的制图符号。大多数符号类型均可用;但在某些情况下,符号会在发布时降级。有关受支持的符号的详细信息,请参阅 ArcGIS for Server 帮助中的创作要素服务,并在发布前对地图符号进行所需的更改。

  1. 启动 ArcGIS Pro 并打开包含要发布的地图的项目。
  2. ArcGIS Pro 中使用具有创建内容和发布托管切片图层权限的帐户登录您的组织。
  3. 单击共享选项卡中的共享为组的Web 图层
  4. 输入要素图层的名称。图层默认保存到我的内容中。 您可以通过输入文件夹名称或浏览已有的文件夹将图层保存到我的内容的文件夹中。
  5. 图层类型中选择切片
  6. 提供切片图层的摘要和标签。
  7. 指定如何共享切片图层。发布的所有图层都会自动共享到您的组织内的个人工作空间中(我的内容)。 其他人无法访问您的内容,除非您在以下一项或多项中共享您的内容:
    • 我的组织 - 选择此选项可允许组织中所有经过身份验证的用户共享此图层。
    • 任何人 - 选择该选项可使图层向任何访问您门户的人开放。
    • - 您可以和您所在组的成员共享图层。
  8. 请单击配置选项卡以指定缓存设置。
    1. 调整并拖拽细节层次条块来为您的切片图层指示最小和最大比例。

      在您更改最小和最大比例时,生成缓存的估计大小会发生改变。

    2. 在发布图层时,选择构建缓存;或在发布图层之后,选择手动构建缓存

      在发布图层之后,打开门户网站中的切片图层以手动构建缓存。

  9. 请单击内容选项卡来确认切片图层将会包含您所需的数据图层。
  10. 单击分析 分析 来检查是否存在任何错误或问题。

    如果发现故障,会将它们列于消息选项卡中。 右键单击每条消息以获取详细信息,阅读错误或警告帮助,然后获取建议的修复方法。在发布前必须修复错误。另外,还可以修复警告,从而进一步完善托管切片图层的性能和外观。

  11. 在修复错误和任何警告(可选)后,请单击发布 发布
    注:

    此时会将您的数据复制到服务器。数据大小以及网络速度和带宽会影响发布过程所花费的时间。

当完成发布时,您可以单击管理 web 图层来打开门户网站。

发布托管要素图层

您可以使用现有托管要素图层向您的门户发布托管切片图层。 如果没有在本地安装任何 ArcGIS 产品,这将是非常有用的工作流程。例如,您可以发布 shapefile 作为托管要素图层,然后将该托管要素图层发布为托管切片图层。

注:

对托管要素图层所做的更改不会自动反映在托管切片图层中。 必须从更新后的托管要素图层中重新发布托管切片图层。

另请注意,在从托管要素图层发布托管切片图层时需要遵循一些样式化限制

要从托管要素图层发布托管切片图层,请按照以下步骤操作:

  1. 使用具有发布托管切片图层权限的帐户进行登录,然后单击我的内容
  2. 要连接,执行下列步骤之一:
    • 单击想要发布的托管要素图层并单击发布
    • 完成授权过程之后,单击 创建 > 切片图层 并选择一个要素图层来发布为切片。
  3. 输入托管切片图层的标题、标签和摘要,并选择一个文件夹。
  4. 此外,通过选择可见范围下拉列表中的比例来更改图层将会显示的范围。
  5. 单击确定
  6. 选中生成切片时要采用的比例旁的方框。然后单击创建切片
    警告:

    如在比例范围中包含大比例,则会使服务器消耗的资源大幅增加。请不要创建超出数据精度的切片。

  7. 检查有关创建的切片数量的消息。如果仍要继续,请单击是,创建切片

发布服务定义文件

发布切片和构建缓存可使用大量的服务器资源。如果需要发布大量切片图层,您的地图创建者可以在 ArcMap 中创建服务定义 (.sdstrLine 文件,定义文件中包含向门户发布切片图层所需的所有信息。 然后可以在工作时间后使用脚本向您的门户上传和发布服务定义文件。生成的切片图层将在您的门户托管服务器上进行托管。

创建服务定义文件

地图创建者应按照以下步骤创建包含将托管于门户中的切片图层所需的数据和符号的服务定义文件。

  1. 启动 ArcMap,然后登录到门户。
  2. 创建和保存地图。

    有关创建和发布地图的信息,请参阅 ArcGIS 帮助中的地图服务主题。

  3. 现在,创建服务定义文件。
  4. 完成授权过程之后,单击 文件 > 共享为 > 服务
  5. 选择保存为服务定义文件,然后单击下一步
  6. 单击选择连接,然后从下拉列表中选择我的托管服务
  7. 输入文件名称并单击下一步
  8. 在您的客户端计算机上指定将在哪个目录中创建服务定义文件,然后单击继续

    随即打开服务编辑器

  9. 服务编辑器的左侧窗格中单击缓存
  10. 选择切片方案
  11. 选择切片的最小比例和最大比例,然后选择计算缓存大小
  12. 单击发布服务后,手动构建缓存
  13. 此外,您还可以单击高级设置并为切片缓存设置其他缓存设置。
  14. 服务编辑器的左侧窗格中,单击项目描述并输入切片图层的信息。

    创建服务定义文件前必须输入至少一个摘要和标签。

  15. 单击分析 分析 以确保没有错误。

    您必须修复错误,然后才能过渡服务定义文件。也可以对返回的警告和消息进行修正。

  16. 修复错误以及警告和消息(可选)后,单击过渡 过渡

服务定义文件保存在您指定的位置。

加载服务定义并发布

从创建者处获取服务定义文件后,可将其手动上传到您门户中的我的内容页面并发布切片图层,或者计划使用脚本来上传和发布该文件。

手动上传和发布

登录到门户网站来向您的门户添加和发布服务定义文件。

  1. 以具有创建内容和发布托管切片图层权限的成员身份登录到您的门户,然后打开我的内容
  2. 单击添加项目
  3. 选择从您的计算机加载文件。
  4. 单击“浏览”按钮,然后选择服务定义文件。
  5. 选中将文件发布为服务
  6. 输入以逗号分隔的标签术语。

    标签是用于描述项目的词语或短语,可提高项目被找到的几率。Federal land 将被视为一个标签,而 Federal,land 将被视为两个标签。

  7. 单击添加项目添加服务定义文件并发布切片图层。

    切片图层发布到您的门户托管服务器,而且服务定义和切片都添加到我的内容中。

  8. 发布切片图层后,您可选择开始构建切片。 单击链接创建切片。

默认情况下,只有您有权访问服务定义文件和托管切片图层。您可以在您的组织或指定组中与他人共享文件和切片。

运行脚本来上传和发布

要在几小时后上传并发布服务定义文件,可自动执行以下脚本以在您的 ArcGIS Server 计算机上运行它们:

  1. 将以下的脚本复制到文本文件并通过 .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.')

  2. 创建您计划用来运行 Python 脚本的批量文件或 shell 脚本。
  3. 在文件中,调用 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.')

  4. 在您的门户内存最低时,计划要运行的脚本。

    请参阅 ArcGIS 地理处理帮助中的将 Python 脚本计划为在预定时间运行以获取更多有关计划脚本的详细信息。