這裏演示如何在JupyterHub中使用iObjects python進行空間數據的查詢操做,從而提取出本身關心的信息。java
查詢結果寫入到另外的數據集中,而後可使用其餘的工具(如iDesktop/iClient等)打開。python
from iobjectspy import (Point2D, QueryParameter, open_datasource, create_datasource, SpatialQueryMode) import os
# 設置示例數據路徑 #example_data_dir = '' example_data_dir = '/home/jovyan/data/smdata/' # 設置結果輸出路徑 out_dir = os.path.join(example_data_dir, 'out') if not os.path.exists(out_dir): os.makedirs(out_dir)
def _write_result_recordset(recordset): """將查詢的結果記錄集寫入數據源中""" record_out_path = os.path.join(out_dir, 'out_query_data.udb') if not os.path.exists(record_out_path): ds = create_datasource(record_out_path) else: ds = open_datasource(record_out_path) assert ds is not None, '打開結果數據源失敗' result_dt = ds.write_recordset(recordset, out_dataset_name=recordset.dataset.name + '_query') if result_dt is not None: print('寫入查詢結果記錄集到數據集 ' + ds.connection_info.server + '|' + result_dt.name + ' 成功') else: print('寫入查詢結果記錄集失敗') ds.close() def attribute_filter_query_test(): """對數據集 landr 進行屬性查詢,並將查詢結果輸出到結果數據源中""" ds = open_datasource(os.path.join(example_data_dir, 'example_data.udb')) assert ds is not None, '打開數據源失敗' dataset = ds['landr'] assert dataset is not None, '獲取數據集失敗' recordset = dataset.query_with_filter('R_AREA > 500 and R_AREA < 5000', cursor_type='STATIC') assert recordset is not None, '查詢記錄集失敗' print('屬性查詢結果記錄數爲: ' + str(recordset.get_record_count())) _write_result_recordset(recordset) ds.close() def bounds_query_test(): """對數據集 landr 進行地理範圍查詢,並將查詢結果輸出到結果數據源中""" ds = open_datasource(os.path.join(example_data_dir, 'example_data.udb')) assert ds is not None, '打開數據源失敗' dataset = ds['landr'] assert dataset is not None, '獲取數據集失敗' rc = ds['adminR'].get_geometries('SmID == 2')[0].bounds recordset = dataset.query_with_bounds(rc, cursor_type='STATIC') assert recordset is not None, '查詢記錄集失敗' print('範圍查詢結果記錄數爲: ' + str(recordset.get_record_count())) _write_result_recordset(recordset) ds.close() def distance_query_test(): """對數據集 landp 進行距離查詢, 查詢距離爲100米, 並將查詢結果輸出到結果數據源中""" ds = open_datasource(os.path.join(example_data_dir, 'example_data.udb')) assert ds is not None, '打開數據源失敗' dataset = ds['landp'] assert dataset is not None, '獲取數據集失敗' recordset = dataset.query_with_distance(Point2D(315.782892179537, 260.119529494306), 100, unit='Meter', cursor_type='STATIC') assert recordset is not None, '查詢記錄集失敗' print('距離查詢結果記錄數爲: ' + str(recordset.get_record_count())) _write_result_recordset(recordset) ds.close() def spatial_query_test(): """對數據集 landp 進行空間查詢查詢, 並將查詢結果輸出到結果數據源中""" ds = open_datasource(os.path.join(example_data_dir, 'example_data.udb')) assert ds is not None, '打開數據源失敗' dataset = ds['landp'] assert dataset is not None, '獲取數據集失敗' query_geo = ds['adminR'].get_geometries('SmID == 2')[0] query_parameter = (QueryParameter().set_spatial_query_mode(SpatialQueryMode.CONTAIN). set_spatial_query_object(query_geo).set_cursor_type('static')) recordset = dataset.query(query_parameter) assert recordset is not None, '查詢記錄集失敗' print('空間查詢結果記錄數爲: ' + str(recordset.get_record_count())) _write_result_recordset(recordset) ds.close()
if __name__ == '__main__': # 屬性查詢 attribute_filter_query_test() # 範圍查詢 bounds_query_test() # 距離查詢 distance_query_test() # 空間查詢 spatial_query_test()
java -cp /opt/conda/lib/python3.6/site-packages/iobjectspy/_jsuperpy/jars/com.supermap.jsuperpy-9.1.1.jar com.supermap.jsuperpy.ApplicationExample 127.0.0.1 49289 [iObjectsPy]: Connection gateway-service successful, Python callback port bind 39229 屬性查詢結果記錄數爲: 319 寫入查詢結果記錄集到數據集 /home/jovyan/data/smdata/out/out_query_data.udb|landr_query 成功 範圍查詢結果記錄數爲: 96 寫入查詢結果記錄集到數據集 /home/jovyan/data/smdata/out/out_query_data.udb|landr_query_1 成功 距離查詢結果記錄數爲: 458 寫入查詢結果記錄集到數據集 /home/jovyan/data/smdata/out/out_query_data.udb|landp_query 成功 空間查詢結果記錄數爲: 49 寫入查詢結果記錄集到數據集 /home/jovyan/data/smdata/out/out_query_data.udb|landp_query_1 成功