Ошибка циклической ссылки при попытке обновить объекты ГИС через ArcGIS Online - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь выполнить шаги, перечисленные здесь , чтобы обновить функцию в AGOL из локального класса объектов.Я продолжаю получать циклическую ссылку в цикле for, и я не уверен, почему это происходит.

Пожалуйста, посмотрите код, который я использую ниже.

import arcgis, arcpy, csv, os, time, copy, pandas as pd
from arcgis.gis import GIS
from pandas import DataFrame
from copy import deepcopy
gis = GIS("url", "username","pass")
fc = gis.content.get('ItemID')
flayer = fc.layers[0]
fset=flayer.query()
fields = ('GPS_Time','Visibility','EngineeringSection','Condition')
UpdateLayer  = "C:\\Users\\USer\\Documents\\ArcGIS\\Default.gdb\\Data"
UpdateTable=DataFrame(arcpy.da.FeatureClassToNumPyArray(UpdateLayer , fields, skip_nulls=True))
overlap_rows = pd.merge(left=fset.sdf, right = UpdateTable, how='inner', on='EngineeringSection')
features_for_update = []
all_features = fset.features    
for EngSec in overlap_rows['EngineeringSection']:
    original_feature = [f for f in all_features if     f.attributes['EngineeringSection'] == EngSec][0]
    feature_to_be_updated = deepcopy(original_feature)
    matching_row = UpdateTable.where(UpdateTable['EngineeringSection'] == EngSec).dropna()
    original_feature.attributes['GPS_Time'] = (matching_row['GPS_Time'])
    original_feature.attributes['Visibility'] = int(matching_row['Visibility'])
    original_feature.attributes['Condition'] = str(matching_row['Condition'])
    update_result = flayer.edit_features(updates=[original_feature])
    flayer.edit_features(updates= features_for_update)

Вот ошибка, которую я получаю:

Traceback (most recent call last):
  File "<stdin>", line 9, in <module>
  File "C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\arcgis\features\layer.py", line 1249, in edit_features
default=_date_handler)
  File "C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\json\__init__.py", line 238, in dumps
**kw).encode(obj)
  File "C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\json\encoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
  File "C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\json\encoder.py", line 257, in iterencode
return _iterencode(o, 0)
ValueError: Circular reference detected

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

Спасибо за вашу помощь, я смог запустить все это с помощью этого скрипта: я также добавил, что через некоторое время я посмотрел, сколько времени это заняло

import arcpy, csv, os, time
import pandas as pd
from arcgis.gis import GIS
from pandas import DataFrame
from copy import deepcopy
start_time = time.time()
gis = GIS("url", "user","pass")
fc = gis.content.get('ContentID')
flayer = fc.layers[0]
fset=flayer.query()
fields = ('GPS_Time','Visibility','EngineeringSection','Condition')
UpdateLayer  = "C:\\Users\\user\\Documents\\ArcGIS\\Default.gdb\\data"
UpdateTable=DataFrame(arcpy.da.FeatureClassToNumPyArray(UpdateLayer , fields, skip_nulls=True))
overlap_rows = pd.merge(left=fset.sdf, right = UpdateTable, how='inner', on='EngineeringSection')
features_for_update = []
all_features = fset.features
for EngSec in overlap_rows['EngineeringSection']:
    original_feature = [f for f in all_features if f.attributes['EngineeringSection'] == EngSec][0]
    feature_to_be_updated = deepcopy(original_feature)
    matching_row = UpdateTable.where(UpdateTable['EngineeringSection'] == EngSec).dropna()
    feature_to_be_updated.attributes['GPS_Time'] = matching_row['GPS_Time'].iloc[0]
    feature_to_be_updated.attributes['Visibility'] = int(matching_row['Visibility'])
    feature_to_be_updated.attributes['Condition'] = str(matching_row['Condition'].iloc[0])
    update_result = flayer.edit_features(updates=[feature_to_be_updated])
    update_result
elapsed_time = time.time() - start_time
totaltime = time.strftime("%H:%M:%S", time.gmtime(elapsed_time))
print("Total processing time: "+ totaltime)
0 голосов
/ 28 февраля 2019

В строке ниже назначается кортеж в качестве значения атрибута.Это то, что вы хотели?

original_feature.attributes['GPS_Time'] = (matching_row['GPS_Time'])

Если вы хотите присвоить значение, просто сделайте:

original_feature.attributes['GPS_Time'] = matching_row['GPS_Time']

Кроме того, я думаю, что эта строка:

flayer.edit_features(updates= features_for_update)

Должно быть:

flayer.edit_features(updates=[feature_to_be_updated])
...