Skip To Content

发布托管切片图层

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

您可使用以下任意一种方法发布将在您的门户上托管的切片图层:

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

要发布托管切片图层,您必须是门户中以下内容之一的成员:

从托管要素图层发布

您可以使用所拥有的现存托管要素图层向您的门户发布托管切片图层。在可视化大型数据集方面此工作流非常有用,因为相比于动态渲染要素,缓存切片绘制得更快。

注:

  • 对托管要素图层所做的空间属性编辑不会自动反映在托管切片图层中。必须从更新后的托管要素图层中重新发布托管切片图层。
  • 托管要素图层上存在可能阻止您发布托管切片图层的样式化限制
  • 您不能通过多面体或点云托管要素图层发布托管切片图层。

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

  1. 登录您的门户并单击内容 > 我的内容
  2. 要进行发布,请执行下列步骤之一:
    • 单击想要发布的托管要素图层并单击发布
    • 单击创建 > 切片图层,并选择作为切片发布的要素图层
  3. 输入托管切片图层的标题、标签和摘要。
  4. 如果门户管理员已配置内容类别,请单击分配类别并最多选择 20 个类别以方便其他用户查找您的项目。您也可以使用过滤器类别框来缩小类别列表范围。

    ArcGIS Enterprise 10.6.1 起,系统提供了类别。

  5. 选择要存储托管切片图层的文件夹。
  6. 或者,通过拖动可视范围端点更改图层的显示范围。
    警告:

    门户网页会显示建议的比例范围,但您可以对其进行修改。但请注意,如在比例范围中包含大比例,则会使门户的托管服务器消耗的资源大幅增加。请不要创建超出数据精度的切片。

  7. 单击确定

    将创建托管切片图层,并显示其项目页面。

ArcGIS Pro 中定义并发布地图

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

注:

如果已对 ArcGIS Pro 中的图层应用了定义查询,则 ArcGIS 将把定义查询应用到已发布的托管切片图层。但是,所有数据都会复制到 ArcGIS Enterprise。如果希望发布数据的子集,则必须将子集导出到其他要素类中,然后将其发布。

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

  1. 开启 ArcGIS Pro 并打开包含要发布的地图的工程。
  2. 请确保您的门户连接处于活动状态,且您已使用具有创建内容和发布托管切片图层权限的帐户登录到您的组织。
  3. 要发布切片图层,请执行以下操作之一:
    • 内容窗格中选择这些图层。右键单击选择集,然后单击共享为 Web 图层
    • 要在地图中发布所有图层,请在共享选项卡的共享为组中单击 Web 图层,然后单击发布 Web 图层

    提示:

    如果共享为 Web 图层菜单选项未激活,则可能由下列某一原因导致:

    • 登录时所使用的帐户不具有发布托管图层的权限。
    • 您的门户未对托管 Web 图层所需的托管服务器进行配置。
    • 正在尝试发布不受支持的多面体图层。

  4. 输入切片图层的名称。图层默认保存到我的内容中。您可以通过输入子文件夹名称或浏览已有的文件夹将图层保存到我的内容的子文件夹中。
  5. 选择复制所有数据
  6. 图层类型中选择切片

    这样会自动取消选中其他图层类型选项,因为复制数据时仅可选中一个选项。

  7. 提供切片图层的摘要和标签。
  8. 请指定应该访问托管切片图层的用户。发布的所有图层都会自动共享到您的组织内的个人工作空间中(我的内容)。其他人无法访问您的内容,除非您在以下一项或多项中共享您的内容:
    • 门户的名称 - 选择此选项可允许组织中所有经过身份验证的用户共享此图层。
    • 任何人 - 选择该选项可使图层向具有您门户访问权限的任何人开放。
    • 群组 - 您可以与您所在群组的成员共享图层。
  9. 单击配置,然后单击配置 Web 图层属性按钮以指定缓存设置。
  10. 选择切片方案
  11. 调整并拖拽细节层次条块来为您的切片图层指示最小和最大比例。

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

  12. 选择构建切片缓存的时间和位置。
    • 在发布图层时,如果您希望在门户的托管服务器上构建切片,请选择在服务器上自动缓存
    • 如果要在门户的托管服务器上构建和存储缓存,但您希望在发布后自己构建缓存,请选择在服务器上手动缓存,在发布图层后在门户网站中打开切片图层,然后手动创建缓存。
    • 如果想要在 ArcGIS Pro 计算机上构建并打包缓存,请选择本地缓存,然后在 ArcGIS Pro 计算机上指定一个位置以存储临时切片包。切片包将自动上传到门户的托管服务器以进行解包,并将缓存存储在此。
  13. 要允许用户下载地图切片以供离线使用,请选中允许客户端导出缓存切片
  14. 如果选中了允许客户端导出缓存切片,请使用导出限制为字段指定客户端一次可离线使用的最大切片数量。
  15. 请单击内容选项卡来确认切片图层将会包含您所需的数据图层。
  16. 请单击分析来检查错误或故障。

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

  17. 解决错误和某些警告后,单击发布
    注:
    此时会将您的数据复制到服务器。数据大小、网速和带宽会影响发布过程所花费的时间。

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

ArcGIS Pro 中构建切片包,然后将其上传到您的组织

使用创建地图切片包地理处理工具来创建切片包、将包添加到您的组织并发布切片图层。

  1. 打开包含待打包数据的工程。
  2. 打开并运行创建地图切片包地理处理工具。
  3. 切片包生成完成后,使用具有创建内容和发布托管切片图层权限的帐户登录您的门户,然后单击内容 > 我的内容
  4. 从我的计算机添加切片包
  5. 选中将此文件发布为托管图层复选框。
  6. 输入标题。
  7. 如果门户管理员已配置内容类别,请单击分配类别并最多选择 20 个类别以方便其他用户查找您的项目。您也可以使用过滤器类别框来缩小类别列表范围。

    ArcGIS Enterprise 10.6.1 起,系统提供了类别。

  8. 输入标签术语,并以逗号分隔。

    标签是一些词语或短语,用于描述项目并帮助您在搜索时找到项目。Federal land将被视为一个标签,而 Federal,land则被视为两个标签。

  9. 单击添加项目

切片已解包,且已在您的门户中创建托管切片图层。您将能够在我的内容中看到该地图切片和切片包。

ArcMap 中定义并发布地图

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

注:

如果已对 ArcMap 中的图层应用了定义查询,则 ArcGIS 将把定义查询应用到已发布的托管切片图层。但是,所有数据都会复制到 ArcGIS Enterprise。如果希望发布数据的子集,则必须将子集导出到其他要素类中,然后将其发布。

请确保启动 ArcGIS DesktopArcMap 已连接到您的门户。

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

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

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

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

    提示:

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

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

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

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

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

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

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

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

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

ArcMap 中构建并共享切片包,然后发布

利用 ArcMap 可以为地图文档构建切片并将其存储在易于传输的切片包 (.tpk) 文件中。您可以在 ArcMap 中创建切片包,将其共享到您的门户,并将其作为托管切片图层进行发布。

可通过两种方式从 ArcMap 创建并共享切片包。

  • 若要打包并共享少量数据(少于 1 GB),请直接从地图创建并共享切片包。当在门户网站中发布包时,地图文件元素(比如,图例和文本元素)会被保留。
  • 如果拥有超过 1 GB 的数据,请使用地理处理工具打包并分享切片。此方法仅会保留切片从切片包发布切片时的数据,可提升切片创建性能。

提示:

如果希望配置弹出窗口,则必须连同托管切片图层发布要素图层。

发布小型切片包

如果在 ArcMap 中创建的切片包小于 1 GB,则请按以下工作流进行发布:

  1. ArcMap 中打开地图。
  2. 使用具有创建内容和发布托管切片图层的权限的组织帐户登录您的门户。
  3. 单击自定义 > ArcMap 选项 > 共享并确保启用 ArcGIS Runtime 工具已选中。

    这样即可启用您将在下一步中用到的菜单选项。

  4. ArcMap 中,单击文件 > 共享为 > 切片包
  5. 配置下列子步骤中的所有设置。其余设置可由您自行选择配置。
    1. 切片包选项卡上,选择将包上传到我的 ArcGIS 门户帐户
    2. 切片格式选项卡上,选择 ArcGIS Online/Bing 地图/Google 地图作为切片方案
    3. 项目描述选项卡上,提供标记为必填的项目。
    4. 共享选项卡上,可以选择与公众或特定的群组共享包。
  6. 单击共享

    ArcMap 创建切片包之前,可能会提示您保存地图。

    生成切片包可能需要一些时间,尤其是在包括较大比例的情况下。

  7. 切片包生成完成后,使用在 ArcMap 中创建切片包时所用的同一帐户登录您的门户,然后单击内容 > 我的内容
  8. 单击切片包以显示其项目详细信息页面。
  9. 单击发布
  10. 输入标题和标签,然后单击发布

切片已解包,且已在您的门户中创建托管切片图层。您应该在我的内容中看到该图层。

发布大型切片包

要构建并共享大量数据,Esri 建议您使用切片缓存工具集而非上述工作流。这些工具可使用多核进行处理以提升切片生成和发布性能。

按以下顺序执行上述工具。

  1. 运行生成切片缓存切片方案定义切片格网和图像格式。
  2. 运行管理切片缓存构建切片。
  3. 运行导出切片缓存创建切片包。
  4. 运行共享包(位于打包工具集中)将切片上传至您的门户。
  5. 切片包生成完成后,使用在 ArcMap 中创建切片包时所用的同一帐户登录您的门户,然后单击内容 > 我的内容
  6. 单击切片包以显示其项目详细信息页面。
  7. 单击发布
  8. 输入标题和标签。
  9. 如果门户管理员已配置内容类别,请单击分配类别并最多选择 20 个类别以方便其他用户查找您的项目。您也可以使用过滤器类别框来缩小类别列表范围。

    ArcGIS Enterprise 10.6.1 起,系统提供了类别。

  10. 单击发布

切片已解包,且已在您的门户中创建托管切片图层。您应该在我的内容中看到该图层。

从服务定义文件发布

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

创建服务定义文件

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

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

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

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

    随即打开服务编辑者

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

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

  15. 单击分析 分析 以确保不存在任何错误。

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

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

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

加载服务定义并发布

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

手动上传和发布

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

  1. 以具有创建内容和发布托管切片图层权限的成员身份登录到您的门户,然后单击内容 > 我的内容
  2. 单击添加项目
  3. 选择从您的计算机加载文件。
  4. 单击“浏览”按钮,然后选择服务定义文件。
  5. 选中将文件发布为服务
  6. 如果门户管理员已配置内容类别,请单击分配类别并最多选择 20 个类别以方便其他用户查找您的项目。您也可以使用过滤器类别框来缩小类别列表范围。

    ArcGIS Enterprise 10.6.1 起,系统提供了类别。

  7. 输入标签术语,并以逗号分隔。

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

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

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

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

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

运行脚本来上传和发布

要在几小时后上传并发布服务定义文件,可自动执行以下脚本以在您的 GIS 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 脚本计划为在预定时间运行以获取更多有关计划脚本的详细信息。