一个与ArcGIS在线restapi交互的简单包装器。
simple-arcgis-wrapper的Python项目详细描述
简单arcgis包装
一个与ArcGIS在线restapi交互的简单包装器。
关于
这个项目是面向那些希望尽可能容易地将数据导入ArcGIS的开发人员。如果您不熟悉ArcGIS术语,restapi可能会非常混乱,而arcgisapi for Python对于基于云的程序来说很麻烦,因此我们创建了这个简单的包装器来抽象创建资源和添加数据的一些困难。
先决条件
首先你需要一个ArcGIS在线帐户。如果计划使用令牌身份验证,而不是用户名和密码,则需要在开发人员门户上注册应用程序。
那么你就需要对ArcGIS有所了解。
特色服务:
- “功能服务允许您通过Internet提供功能,并提供显示功能时要使用的符号。”
- 要素服务可以存储许多要素图层。在
特征层
- 要素层是一组相似的地理要素,例如建筑物、地块、城市、道路和地震震中
- 一个特征层可以存储许多几何特征。在
功能
- 要素类是公共要素的集合,每个要素具有相同的空间表示,例如点、线或多边形,以及一组公共属性列
安装
pip install simple-arcgis-wrapper
使用
导入
^{pr2}$确认自己
基于令牌的身份验证
您将需要一个注册的应用程序和通过OAuth流获得的令牌。查看this link以了解有关设置OAuth的更多信息。
api = saw.ArcgisAPI(
access_token='ACCESS_TOKEN', # access token obtained from user
refresh_token='REFRESH_TOKEN', # refresh token obtained from user
username='USERNAME', # username obtained from user
client_id='CLIENT_ID' # your OAuth app's client ID
)
用户名和密码验证
如果您只想将数据添加到您自己的帐户中,则可以使用此身份验证方案。对一次性任务使用此选项,因为此方案仅在1小时内有效。将OAuth令牌用于寿命较长的操作。
api = saw.ArcgisAPI.fromusernamepassword(
username='username',
password='password'
)
创建功能服务
service = api.services.create_feature_service('NAME', 'DESCRIPTION')
# service is a FeatureService object
print(service.id, service.name, service.url)
在要素服务中创建要素层
要素图层存储要素,因此您需要定义图层类型和任何其他字段。
fields = saw.fields.Fields()
fields.add_field('Date', saw.fields.DateField)
fields.add_field('Name', saw.fields.StringField)
fields.add_field('Altitude', saw.fields.DoubleField)
layer = api.services.create_feature_layer(
layer_type='point', # point, line, or polygon
name='NAME',
description='DESCRIPTION',
feature_service_url=service.url,
fields=fields,
x_min=10.0, y_min=10.0, # min bounding box parameters
x_max=20.0, y_max=20.0, # max bounding box parameters
wkid=4326 # well-known ID spatial reference
)
# layer is a FeatureLayer object
print(layer.id, layer.name, layer.url)
在功能服务
中创建表表格就像要素图层,只是它没有坐标。
fields = saw.fields.Fields()
fields.add_field('Date', saw.fields.DateField)
fields.add_field('Name', saw.fields.StringField)
fields.add_field('Email', saw.fields.StringField)
table = api.services.create_table(
name="TABLE_NAME",
description="TABLE_DESCRIPTION",
feature_service_url=feature_service.url,
fields=fields
)
# table is a Table object
print(table.id, table.name, table.url)
向要素层添加一个点
# attribute keys must match the layer's fields
attributes = {
'Date': '2020-01-01 15:30:45',
'Name': 'John Doe',
'Altitude': 12.5
}
success = api.services.add_point(
lon=10.0,
lat=20.0,
attributes=attributes
layer_id=layer.id,
feature_service_url=service.url
)
print(success) # True or False
向要素层添加多个点
attributes = {
"Date": "2020-01-01 15:30:45",
"Name": "John Doe",
"DeviceId": "abc123",
}
p1 = {
'lon': 10.0, 'lat': 20.0,
'Date': "2020-01-01 12:12:12",
'Name': 'John Doe',
'DeviceId': 'abc123'
}
p2 = {
'lon': 10.0, 'lat': 20.0,
'Date': "2020-01-01 12:12:12",
'Name': 'John Doe',
'DeviceId': 'abc123'
}
adds = api.services.add_points(
points=[p1, p2],
layer_id=layer.id,
feature_service_url=service.url
)
# adds is a dict where key is object ID and value is success
for object_id, success in adds.items():
print(object_id, success)
获取功能服务
通过传递服务的确切名称来获取功能服务。
other_service = self.api.services.get_feature_service('OTHER_NAME')
获取要素层
通过查找要素服务的ID或确切名称,从要素服务中获取图层。
layer_by_id = api.services.get_feature_layer(service.url, layer_id=0)
layer_by_name = api.services.get_feature_layer(service.url, layer_name="other layer")
获取功能
您可以通过传递SQL92格式的where子句从功能层获取功能,如here所述。指定要与out\$fields参数一起返回的属性。
Pro tip: return all features with where="1=1"
Only point features supported right now.
point_features = api.services.get_features(
where="DeviceId = 'abc123'",
layer_id=layer.id,
feature_service_url=service.url,
out_fields=['OBJECTID']
)
# point is a PointFeature object
point = point_features[0]
print(point.id, point.x, point.y)
更新功能服务
Only updating the service's title supported right now.
success = api.services.update_feature_service(
feature_service_id=service.id,
title="New Title"
)
print(success) # True or False
更新功能
通过传递一个元组列表来更新多个特性,这些元组分别包含一个对象ID、要更新的属性和几何体。如果要基于where子句更新特性,请首先按上述方法获取所需的特性。
If you are not updating attributes or geometry, pass None.
updates_list = [
(0, {"Name": "John Doe II"}, {"x": 10.1, "y": 20.1}),
(1, None, {"x": 10.3, "y": 20.2}),
(1, {"Name": "John Doe II"}, None),
]
updates = api.services.update_features(
updates=updates_list,
layer_id=layer.id,
feature_service_url=service.url
)
for object_id, success in updates.items():
print(object_id, success)
更新表行
通过传递包含要更新的对象ID和属性的元组列表来更新多个表行。可以使用where子句筛选受影响的行。
updates_list = [
(0, {"Name": "John Doe II", "Email": "johndoe2@example.com"}),
(1, {"Name": "John Doe II", "Email": "johndoe2@example.com"})
]
updates = api.services.update_table_rows(
updates=updates_list,
table_id=table.id,
feature_service_url=service.url
)
for object_id, success in updates.items():
print(object_id, success)
从要素图层或表格中删除要素
通过传递sql92where子句删除特性。
deletes = api.services.delete_features(
where="DeviceId = 'abc123'",
layer_id=layer.id,
feature_service_url=service.url
)
for object_id, success in deletes.items():
print(object_id, success)
删除要素图层
api.services.delete_feature_layers([layer.id], service.url)
删除功能服务
api.services.delete_feature_service(service.id)
例外情况
ArcGIS的无效参数可能会导致错误。您可以使用ArcGISException捕捉它们,其中包含从ArcGIS返回的消息。
try:
# try to create a duplicate feature service
api.services.create_feature_service('NAME', 'DESCRIPTION')
except saw.exceptions.ArcGISException as e:
print(e)
测试
试验前配置以下环境变量:
- ARCGIS_访问_令牌
- ARCGIS_刷新标记
- ARCGIS_客户端_ID
- ARCGIS_用户名
- ARCGIS_密码
通过运行这些测试,您将从您的帐户中收取少量费用。
python -m unittest tests/test*.py
作者
- Casey Slaught-Lead developer-Caracal
许可证
这个项目是在麻省理工学院许可下授权的-请参阅LICENSE获取详细信息
- 项目
标签: