Próbuję stworzyć nową instancję ArcGIS.Features .Featurelayer za pomocą pakietu Pythona ArcGIS.

Umożliwiam to niemożliwe, przechodzę przez Dokumentacja i Przykłady i Więcej przykładów , próbując różnych rzeczy i znajdę się w kółko i powoli zaczynam ciągnąć moje usłyszeć ...

Oto co mam:

import arcgis
import json
from arcgis.gis import GIS

g = GIS(username="my_uname", password="my_pwd")
prop = arcgis.features.FeatureCollection(dictdata={'attributes': {'foo': 'bar', 'lorem': 'ipsum'}})
prop_json=json.dumps({"featureCollection": {"layers": [dict(prop.properties)]}})
item_properties={"type": "Feature Collection", "title": "test_feature_collection_01", "text": prop_json}
it = g.content.add(item_properties=item_properties)

W tym momencie - nie rozumiem, dlaczego it.layers daje puste wyniki. Uważam, że item_properties jest źle sformułowany, co powoduje arcgis ignorowanie mojej definicji warstw ... ale nie mam gdzie sprawdzić, jak powinno wyglądać. Pomyślałem, że chciałbym użyć czegoś z arcgis do wygenerowania definicji warstwy dla mnie, zamiast samodzielnie tworzyć JSON, więc jest to przyszłościowe.

To, co chcę później zrobić z tym elementem, to:

lr = arcgis.features.FeatureLayer.fromitem(item=it)

To się nie udaje z TypeError: item must be a type of service, not Feature Collection

Pomyślałem więc, że mogę opublikować przedmiot i użyć go tutaj.

pit = it.publish()
lr = arcgis.features.FeatureLayer.fromitem(item=pit)

Potrzebuję FeatureLayer, aby móc zadzwonić pod numer append (więc mogę po prostu wrzucić dodatkowe dane za każdym razem, gdy mam coś nowego, co chcę przekazać)

Ale ku mojemu zdziwieniu nie mogę nawet opublikować elementu i otrzymuję Exception: Job failed. (ku mojemu większemu zdziwieniu element faktycznie zostaje opublikowany, ponieważ widzę go w witrynie menedżera treści)

Próbowałem też utworzyć typ elementu „CSV”:

import arcgis
import json
from arcgis.gis import GIS


g = GIS(username="my_uname", password="my_pwd")
item_properties={"type": "CSV", "title": "test_feature_collection_01"}
it = g.content.add(item_properties=item_properties, data="/tmp/foo.csv")
pit = it.publish()

lr = arcgis.features.FeatureLayer.fromitem(item=pit)

Jednak skutkuje to elementem bez warstwy, co powoduje nieobsłużony wyjątek IndexError: list index out of range (ponieważ wywołania metody arcgis próbują dostać się do warstw, które są puste ...)

Proszę pomóż...

0
Greg0ry 3 styczeń 2020, 14:59

1 odpowiedź

Najlepsza odpowiedź

Udało mi się uzyskać sort-of to, czego potrzebuję ... jednak wciąż próbuję zrozumieć, jak zmusić arcgis do przesyłania niektórych danych bezpośrednio z mojego dysk twardy zamiast z innego elementu. Tak czy inaczej, oto kod:

import arcgis
import json
from arcgis.gis import GIS

g = GIS(username="my_uname", password="my_pwd")

item_properties_1={"type": "CSV", "title": "test_feature_collection_01"}
it_1 = g.content.add(item_properties=item_properties_1, data="/tmp/my_data.csv")
pit_1 = it_1.publish()
table = arcgis.features.Table.fromitem(item=pit_1)

# Now we want to throw some extra data, do we have to create another item to do that??

item_properties_2={"type": "CSV", "title": "test_feature_collection_02"}
it_2 = g.content.add(item_properties=item_properties_2, data="/tmp/more_data.csv")
source_info = g.content.analyze(file_path='/tmp/more_data.csv', file_type='csv', location_type='none')

# Data from `it_2` appears to be appended to `table` container (which is published item, not item itself)

table.append(item_id=it_2.id, upload_format='csv', source_info=source_info["publishParameters"], upsert=False)

Aby dodać dane do istniejącego elementu, muszę utworzyć nowy element ...


Edytować:

Aby przesłać dane bez konieczności tworzenia tymczasowego elementu, użyj edit_features zamiast append.

# create table like shown in sample above

from arcgis import features
f = features.Feature.from_dict({"attributes": {"some_attribute": "value"}})
fs = features.FeatureSet(features=[f])
table.edit_features(adds=fs)

0
Greg0ry 10 styczeń 2020, 09:08