从这一章开始就需要使用用户凭证等,如果不使用用户凭证,匿名登陆有部分资源无法使用。
首先导入arcgis
import arcgis
要注意的是,示例中省略了输入提示In[]
和输出提示Out[]
,可以检查当前python版本和arcgis api;
import arcgis
import sys
print("Python version: "+sys.version)
print("arcgis api version:"+arcgis.__version__)
Python的ArcGIS API包括几个模块,其中最重要的是gis
模块。gis模块允许管理gis的内容,以及用户及其角色。gis
模块的主要类别是GIS
。GIS
对象表示通过ArcGIS Online或通过ArcGIS Enterprise实例使用的GIS,这个对象将成为使用ArcGIS API for Python的切入点。
要开始,请导入GIS类
from arcgis.gis import GIS
当使用from import导入GIS
类时,一开始不需要使用import arcgis
。接下来,创建一个GIS
对象
mygis = GIS()
GIS
类有几个可选参数,包括URL、用户名和密码。 URL可以是ArcGIS Online的网址,也可以是本地门户网站,格式如下:https://gis.example.com/portal.如果这些参数为空,则表示您正在使用匿名登录ArcGIS Online。
图中显示了用于提供用户凭据的示例代码。
要创建Jupyter Notebook并使用ArcGIS API for Python,不需要提供用户凭据,使用将仅限于公共数据集。若要使用组织内托管的数据集,必须使用用户凭据进行身份验证。在使用ArcGIS Online门户时,API的某些功能使用credits,这也是身份验证可能是必要的另一个原因。
arcgis.GIS
模块的GIS
类的完整语法可以在在线API参考中找到,如下所示:
class arcgis.gis.GIS(url=None, username=None, password=None,
key_file=None, cert_file=None,
verify_cert=True, set_active=True,
client_id=None, profile=None, **kwargs)
Python的ArcGIS API文档中的语法符号与ArcPy文档中使用的符号略有不同。ArcPy的类和函数的可选参数用大括号{}
括起来,而在前面的示例中,任何可选参数都被赋予默认值或初始化为None。列出的任何所需参数都没有默认值,但不需要GIS类的任何参数。还要注意,文档中的语法以关键字类开头,但在实际代码中没有使用。
结尾的**kwargs
参数代表“keyworded
”或命名参数,它们与前面的显式命名参数是分开的。使用**kwargs
可以传递一个或多个附加参数。在GIS类的情况下,这些参数由代理服务器和令牌设置组成。
在帮助页面的“Working with Different Authentication Schemes”主题下,详细描述了验证用户凭据的其他方法。一个有用的替代方法是使用ArcGIS Pro应用程序中的活动门户进行连接,即所谓的pro
验证方案,如下所示:
from arcgis.gis import GIS
mygis = GIS("pro")
只有在本地安装ArcGIS Pro并同时运行时,身份验证才有效。ArcGIS Pro中的凭据用于身份验证,而无需在代码中指定这些凭据。
下一步是创建一个基本的地图显示,以可视化您的空间数据。GIS
对象包括一个用于此目的的地图小部件。小部件就像一个在笔记本电脑中运行的小型应用程序。Jupyter Notebook包括几个用于信息显示和用户交互的小部件,但地图小部件是作为arcgis
包的一部分添加的。
mymap = mygis.map("Beijing")
这个小部件创建一个以提供的位置为中心的地图。还可以提供纬度和经度的坐标元组。当提供一般位置描述、地址或地标时,这些位置使用默认的地理编码器进行地理编码。如果您没有指定位置,地图小部件将返回世界地图。
可以通过键入地图小部件的名称来显示:
使用Jupyter Notebook的一个关键好处是,可以直接在笔记本中显示GIS的地图,并且结果会与代码交互更新。例如,可以使用地图小部件的basemap
属性来更改basemap。
mymap.basemap = "gray-vector"
尽管Jupyter Notebook的使用相对直观,但在启动和运行时遇到问题是很常见的。使用地图小部件时,一个常见的问题是根本没有得到响应代码似乎已经运行,但没有显示地图,也没有错误消息,通常意味着您的浏览器出现问题。
您可以更改操作系统上的默认浏览器并重新启动Jupyter Notebook,也可以将命令提示符窗口中的URL复制到其他浏览器中。只是复制http://localhost:8888/tree还不够,您还必须复制令牌。其他常见问题是验证用户凭据的困难,因为存在几种不同的验证方案。如果您在本地安装了ArcGIS Pro,那么如果您保持ArcGIS Pro同时运行,pro
身份验证是一个方便的解决方案。
现在,已经启动并运行了Jupyter Notebook,并且可以使用arcgis软件包来显示简单的地图,现在是时候添加新内容了。示例使用一个新笔记本,并从不同研究区域的地图开始,
可以使用GIS
对象的内容特性来搜索内容。content
属性返回ContentManager
类的一个实例。这个类的 search()
方法定位感兴趣的项。到目前为止,代码行是:
search_result = mygis.content.search()
search()
方法有查询的参数(作为字符串)、项的类型、项的最大数量以及其他几个参数。在原书的示例中,搜索的是 与纽约市出租车数据相关的特征层,并返回最多5个项目,结果是Item对象的列表。
这里搜索的学校,但是感觉结果不准确啊:
search_result = mygis.content.search("school","Feature Layer",max_items=5)
search_result
使用了匿名登录,因此结果由ArcGIS Online中符合搜索条件且公开可用的项目组成 项目可以是许多不同的东西,包括网络地图、功能服务、图像服务等等。每个项目都有一个唯一的标识码和一个众所周知的URL。通过将搜索限制为特定的项目类型,只会将这些类型作为列表的一部分返回。因为这些项是以Python列表的形式返回的,所以可以使用索引来获取特定项。查询单个项目时,将显示该项目的丰富表示形式,其中包括缩略图、简要描述、类型、修改日期以及指向门户网站上项目页面的超链接。 除了使用web GIS中已有的数据外,还可以通过将数据发布到GIS来创建新内容,下面的例子,使用一个新的笔记本,从加拿大不列颠哥伦比亚省温哥华市 Vancouver, British Columbia, Canada 不同研究区域的地图开始 但是由于该任务涉及将新项目发布到ArcGIS Online,因此仅进行匿名登录是不够的。为了使代码示例正常工作,必须使用具有发布者权限的ArcGIS Online凭据,或者使用专业身份验证方案,第二行代码中的URL、用户名和密码必须替换为您的凭据。 本例中要添加的数据位于本地计算机上的CSV文件中,数据包括温哥华市超过100000棵行道树的位置。笔记本的目的是使用 导入 这个例子也说明了Pandas在Jupyter笔记本中使用时的多功能性。不仅可以轻松地从本地和在线资源中读取数据集,还可以直接在笔记本内显示数据样本。这个功能不同于其他IDE,在其他IDE中,结果通常在单独的窗口中查看,格式不太方便。 为了使属性更易于管理,将选择并组织最相关的field,结果作为一个新的 此处不需要第二行代码,用来确认结果是一个功能集合。 要在ArcGIS Online中将要素集合作为项目发布,必须将要素集合转换为 使用ArcGIS API for Python可以执行许多其他任务,包括地理编码、处理图像和执行网络分析。许多在本地数据上使用ArcGIS Pro和ArcPy的工作流可以使用ArcGIS API for Python为web GIS copy,而无需使用ArcGIS Online或Portal for ArcGIS的界面手动执行这些任务,这部分的重点是执行空间分析任务,这与在ArcGIS Pro中使用地理处理工具相当。 用于Python的ArcGIS API包括几个模块,用于执行专门的分析任务。这些模块包括用于光栅和图像分析的
school_data = search_result[1]
school_data
在这种情况下,是一个要素图层集合,它可以包含一个或多个要素图层,特定要素图层集合包括四个要素图层。将此项目添加到地图小部件时,将添加所有这些层。您也可以使用索引来选择要使用的特定层,。school_lyr = school_data.layers[0]
school_lyr
结果是单个特征层的URL。引用要素图层变量的第二行代码是不必要的,在本例中仅用于控制结果,现在可以使用add_layer()
方法将特定层添加到地图显示中:可以看到中国内的搜索结果不是准确,也可能是账户问题或者我的操作。
可以使用arcgis.mapping
模块的功能自定义添加到地图小部件中的图层的符号。
有关此功能的详细说明,要参阅ArcGIS API for Python的文档。9.10 创建新内容
对于下一个示例,必须登录ArcGIS Online或门户网站才能发布项目,因为对结果进行地理编码需要积分。Pandas
读取该数据集,然后将该数据作为新项目发布到ArcGIS Online。Pandas
后,通过读取本地CSV来创建DataFrame
对象。为了方便发布数据的过程,为了便于说明,创建了100条记录的随机样本, sample()
方法用于将此示例创建为新的DataFrame对象。为了检查笔记本内的数据,显示前五行:
数据集包括唯一ID、街道地址、纬度和经度的field,以及每棵树的描述性详细信息。因为要显示的列太多,所以前五行的显示包括一个滚动条来滚动列。DataFrame
对象返回,如下所示。
一旦以DataFrame
对象的形式获得了所需的数据集,下一步就是将数据作为特征集合导入。导入可以使用ContentManager
类的import_data()
方法来完成。该类的一个名为content
的实例可以作为GIS
对象的属性使用,DataFrame
对象是import_data()
方法的参数。import_data()
方法适用于Pandas数据帧或空间启用数据帧(SEDF)。SEDF是一类arcgis.features
模块,用于赋予Pandas DataFrame空间能力。使用import_data()
时,将Pandas DataFrame作为功能集合Item导入时,限制为1000行。使用SEDF时不适用此类限制,arcgis.features
模块还包括将Pandas数据帧转换为SEDF的功能。JSON
对象。为了实现这一点,特性集合被转换为Python字典,该字典在json.dumps()
函数中用于创建json对象。
这个分析步骤是使用ContentManager类的add()
方法将JSON对象发布为一个项。为了使发布的条目更可用,提供了几个条目特征作为字典,包括标题、描述、几个标记和类型。这些项目都不是必需的,但它们代表了良好的实践。在这种情况下,唯一需要的键是指定JSON对象的文本键。
此单元格中的分析代码行将显示已发布项目的快照。发布项目后,可以将其作为图层添加到地图显示中。另一种解决方案是首先t将CSV 文件作为项目发布在ArcGIS Online中,然后使用GIS对象的publish()
方法将其发布为特征层。这个解决方案不需要使用Pandas,也不需要使用JSON对象将数据转换为特征集合,完整的代码解决方案显示为图中的单个单元格。
这个是替代解决方案,发布整个CSV文件,包括所有记录和所有字段。Pandas的使用提供了更多的可屏蔽性,因为它允许在发布数据之前进行数据清理和更改。
在这两种情况下,结果都是可以添加到显示中的主体要素图层。
arcgis.gis
模块的ContentManager
类中提供了许多其他方法。除了添加项目外,还有批量更新、克隆、创建服务、删除项目和共享的方法。9.11 Performing analysis 部分
arcgis.raster
模块、用于网络分析的arcgis.network
模块和用于大型数据集分布式分析的arcpy.geoanalytics
模块。一些更“基本”的分析工具是arcgis.features
模块的一部分,用于处理向量数据集。arcgis.geoprocessing
模块主要用于将发布到web GIS的web工具作为Python模块导入。它不包括ArcGIS Pro中可用的地理处理工具,正如名称所暗示的那样。