ArcGIS API For Python 04 - 訪問和創建內容

通過ArcGIS Online或者ArcGIS Enterprise,你可以擁有各種各樣的地圖、Web圖層、分析工具、APP以及單獨的文件。使用gis模塊,你可以查詢、訪問和管理你的文件夾、內容,並且可以自動執行腳本程序等。

關於查詢

在前幾篇博客中,我們提到,Python API使用資源管理類(Resources Manager Class)來管理Web GIS中的用戶、羣組、DataStore和內容。可以通過訪問GIS示例的屬性usersgroupscontent來對應的獲取UserManagerGroupManagerContentManager類。

這些資源管理類中的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。

創建新的內容

可以通過訪問ContentManageradd()方法來創建新的內容。同樣,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_folderdelete_folder方法來管理文件夾。然後使用Item對象實例的move方法來移動內容至特定的文件夾。

gis.content.create_folder("PythoAPI")
empty_service_item.move(folder="PythoAPI")

如果需要將內容移動至主目錄下面,其參數folder爲"/"。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章