通過ArcGIS Online或者ArcGIS Enterprise,你可以擁有各種各樣的地圖、Web圖層、分析工具、APP以及單獨的文件。使用gis
模塊,你可以查詢、訪問和管理你的文件夾、內容,並且可以自動執行腳本程序等。
關於查詢
在前幾篇博客中,我們提到,Python API使用資源管理類(Resources Manager Class)來管理Web GIS中的用戶、羣組、DataStore和內容。可以通過訪問GIS
示例的屬性users
、groups
和content
來對應的獲取UserManager
、GroupManager
和ContentManager
類。
這些資源管理類中的search
方法表示ArcGIS RREST API中的search
操作。search
機制使用多種不同的輸入來尋找可能的匹配項,對它們進行排序並返回適當的結果,這種結果是具有不確定性的。使用search
可能不是查詢特定項的最優方法,但可能是對一組項進行進一步篩選的最佳方法。
另外,使用Python API中的search
與使用另外一種程序語言編寫的search
應用的結果可能不一致。不同的應用程序可能使用不同的輸入。
- 查詢示例
from arcgis.gis import GIS
gis = GIS(url="https://singlega.jiaoxn.local/arcgis", username="esricd", password="12345678", verify_cert=False)
search_results = gis.content.search(query="owner:" + gis.users.me.username)
search_results
- 查詢建議
熟悉Python語法的朋友,可以使用Python的List來輔助增強search
功能以實現更加精確的查詢。
import datetime as dt
day_start = dt.datetime(2019, 5, 30, 0, 0, 0)
day_end = dt.datetime(2020, 5, 30, 0, 0, 0)
start_timestamp = int(day_start.timestamp() * 1000)
end_timestamp = int(day_end.timestamp() * 1000)
content_search_resulst = [item
for item in search_results
if item.created > start_timestamp
and item.created < end_timestamp]
content_search_resulst
查詢內容
訪問gis
對象的content
屬性將會返回一個ContentManager
類的實例。可以使用該示例的search
方法在你的GIS中查詢內容,對於匿名用戶來講,僅能查詢ArcGIS Online中公開的內容。
search
查詢對象將會返回一組滿足查詢條件以及當前用戶有權限訪問的Item
對象列表。
更多的查詢條件可以查看這裏。
通配符查詢
search
方法支持通配符查詢,其中*
表示任意字符,?
表示一個字符。
在門戶外面搜索內容
當連接ArcGIS Online或者配置可訪問ArcGIS Online的ArcGIS Enterprise時,你可以查詢發佈的和公共共享的內容,即便這些內容是其他Portal發佈的。完成上述效果,只需將search
函數的參數outside_org
爲True。
創建新的內容
可以通過訪問ContentManager
的add()
方法來創建新的內容。同樣,Python API沒有直接創建ContentManager
的實例,而是將其作爲GIS
對象的屬性來實現的。使用這種方式創建的所有內容將會存放在當前登錄用戶的內容下。
import os
file_path = os.path.join("/opt/notebooks/Untitled Folder", "地級市點.csv")
csv_properties={'title':'Test',
'description':'Measurements from globally distributed seismometers',
'tags':'python'}
cities_csv_item = gis.content.add(item_properties=csv_properties, data=file_path)
cities_csv_item
add()
方法將會返回一個arcgis.gis.Item
對象實例,可在jupyter notebook中直接查看。
將內容項發佈爲Web圖層
上面的示例演示了上傳一個CSV文件到Portal中。像CSV文件、服務定義文件、File GDB、SHP和包(如tile、scene和vector tile包)等內容項均可發佈成託管的Web圖層,使用的方法是Item
對象實例的publish
方法。發佈的Web圖層的元數據使用其元數據的元數據(縮略圖、標題和描述)。
cities_feature_layer_item = cities_csv_item.publish()
從Pandas數據模式中導入數據
使用Python API,你可以將Pandas的數據通過import_data()
方法導入,其結果格式爲arcgis.features.FeatureCollection
。然後,你可以將其添加到你的GIS中。
- 使用Pandas的
iread_csv
方法讀取CSV文件數據
import pandas
ports_df = pandas.read_csv(file_path)
- 使用
import_data
方法讀取Pandas數據爲FeatureCollection
ports_fc = gis.content.import_data(ports_df)
feature collection
將會暫時保存在內容,其屬性中包含了 圖層定義信息和FeatureSet。接下來,可依據這些屬性構建一個字典,如下:
import json
ports_fc_dict = dict(ports_fc.properties)
ports_json = {
"featureCollection": {
"layers": [ports_fc_dict]
}
}
- 使用
add
方法將導入
ports_item_properties = {'title': 'Example',
'description':'Example demonstrating conversion of pandas ' + \
'dataframe object to a GIS item',
'tags': 'arcgis python api, pandas, csv',
'text':ports_json,
'type':'Feature Collection'}
ports_item = gis.content.add(ports_item_properties)
ports_item
發佈一個空服務
有時我們也會需要發佈一個空服務,然後在使用客戶端軟件對它進行編輯。在Python API中,可使用create_service
方法創建一個空服務。
create_service
函數需傳遞一個服務名稱,爲了避免重複的名稱,可通過is_service_name_available
方法判斷名稱是否可用。
service_name = "jiaoxn"
service_type = "featureService"
if gis.content.is_service_name_available(service_name=service_name, service_type=service_type):
empty_service_item = gis.content.create_service(name=service_name, service_type=service_type)
組織內容
當你的Protal中的內容過多時,可以通過創建文件夾來分類管理。在Python API中,可使用ContentManager
示例中的create_folder
和delete_folder
方法來管理文件夾。然後使用Item
對象實例的move
方法來移動內容至特定的文件夾。
gis.content.create_folder("PythoAPI")
empty_service_item.move(folder="PythoAPI")
如果需要將內容移動至主目錄下面,其參數folder
爲"/"。