OSM API<\/A>.<\/P><\/P>
response <SPAN class="operator token">=<\/SPAN> api<SPAN class="punctuation token">.<\/SPAN>Get<SPAN class="punctuation token">(<\/SPAN><SPAN class="string token">'node['<SPAN class=\"operator token\">+<\/<SPAN> category <SPAN class=\"operator token\">+<\/<SPAN> <SPAN class=\"string token\">']('<\/<SPAN> <SPAN class=\"operator token\">+<\/<SPAN> minLat <SPAN class=\"operator token\">+<\/<SPAN> <SPAN class=\"string token\">','<\/<SPAN> <SPAN class=\"operator token\">+<\/<SPAN> minLon <SPAN class=\"operator token\">+<\/<SPAN> <SPAN class=\"string token\">','<\/<SPAN> \n <SPAN class=\"operator token\">+<\/<SPAN> maxLat <SPAN class=\"operator token\">+<\/<SPAN> <SPAN class=\"string token\">','<\/<SPAN> <SPAN class=\"operator token\">+<\/<SPAN> maxLon <SPAN class=\"operator token\">+<\/<SPAN> <SPAN class=\"string token\">')'<\/<SPAN><SPAN class=\"punctuation token\">,<\/<SPAN> responseformat<SPAN class=\"operator token\">=<\/<SPAN><SPAN class=\"string token\">"json"<\/<SPAN><SPAN class=\"punctuation token\">)<\/<SPAN> \n elements <SPAN class=\"operator token\">=<\/<SPAN> response<SPAN class=\"punctuation token\">[<\/<SPAN><SPAN class=\"string token\">"elements"<\/<SPAN><SPAN class=\"punctuation token\">]<\/<SPAN> \n <SPAN class=\"keyword token\">for<\/<SPAN> element <SPAN class=\"keyword token\">in<\/<SPAN> elements<SPAN class=\"punctuation token\">:<\/<SPAN> \n dictElement <SPAN class=\"operator token\">=<</span>{}<span></span>
tags = element["tags"]
tags = tags[0]
for key_att in attributes:
                        val_att = attributes[key_att]
                   if val_att in tags:
                dictElement[key_att] = tags[val_att]
  id = element["id"]
#id = float(id)
dictElement["id"] = id
dictElement["lon"] = element["lon"]
dictElement["lat"] = element["lat"]
if "user" in attributes or "timestamp" in attributes:
try:
node = oApi.NodeGet(element["id"])
if "user" in attributes:
<SPAN class="keyword token">se</SPAN> <SPAN class="string token">"user"</SPAN> <SPAN class="keyword token">em</SPAN> node<SPAN class="punctuation token">.</SPAN>keys<SPAN class="punctuation token">()</SPAN><SPAN class="punctuation token">:</SPAN>
dictElement<SPAN class="punctuation token">[</SPAN><SPAN class="string token">"user_"</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">=</SPAN> node<SPAN class="punctuation token">[</SPAN><SPAN class="string token">"user"</SPAN><SPAN class="punctuation token">]</SPAN>
<span style="white-space: pre;"> </span><SPAN class="keyword token">se</SPAN> <SPAN class="string token">"timestamp"</SPAN> <SPAN class="keyword token">em</SPAN> attributes<SPAN class="punctuation token">:</SPAN>
<span style="white-space: pre;"> </span><SPAN class="keyword token">se</SPAN> <SPAN class="string token">"timestamp"</SPAN> <SPAN class="keyword token">em</SPAN> node<SPAN class="punctuation token">.</SPAN>keys<SPAN class="punctuation token">()</SPAN><SPAN class="punctuation token">:</SPAN>
dictElement<SPAN class="punctuation token">[</SPAN><SPAN class="string token">"timestamp"</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">=</SPAN> node<SPAN class="punctuation token">[</SPAN><SPAN class="string token">"timestamp"</SPAN><SPAN class="punctuation token">]</SPAN>
<span style="white-space: pre;"> </span><SPAN class="keyword token">exceto</SPAN><SPAN class="punctuation token">:</SPAN>
<span style="white-space: pre;"> </span><SPAN class="keyword token">print</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="string token">"Node para este elemento não disponível"</SPAN><SPAN class="punctuation token">)</SPAN>
dictElement<SPAN class="punctuation token">[</SPAN><SPAnclass= "stringtoken "> "attribute " </ SPAn > < SPAnclass= "operatortoken "> = </ SPAn > key_cat < SPAnclass= "operatortoken "> + </ SPAn > < SPAnclass= "stringtoken "> "-" </ SPAn > < SPAnclass= "operatortoken "> + </ SPAn > val_cat
dictData<SPAnclass= "punctuationtoken ">.append(</ SPAn > dictElement)
Esses dados agora são estruturados em um dicionário, convertidos em um DataFrame do pandas e retornados para uso posterior. Em um segundo <A href="https://github.com/EsriDE/EsriDE-python-osm2arcgis/blob/master/agolconfig.json" rel="nofollow noopener noreferrer" target="_blank">arquivo JSON</A>, as configurações para ArcGIS Online ou ArcGIS for Portal são definidas.
<center><img class="image-3 jive-image" src="https://us.v-cdn.net/6038851/uploads/legacyfs/online/390887_pastedImage_3.png" style="width: auto; height: auto;" /></center>
Se os dados necessários estiverem disponíveis, eles serão verificados quanto à correção. Isso significa que uma conexão é estabelecida usando as informações de login. Isso é necessário para garantir que o ID do Feature Service esteja correta se ele precisar ser sobrescrito. Se a entrada estiver completa e correta, outro <A href="https://github.com/EsriDE/EsriDE-python-osm2arcgis/blob/master/DataToAGO.py" rel="nofollow noopener noreferrer" target="_blank">script Python </A> será iniciado. Ao atualizar um Feature Service, ele é esvaziado, o DataFrame é dividido em blocos e adicionado ao Feature Service em lotes de 100 features cada.
listAddFeatures <SPAnclass= "operatortoken "> = []
i <SPAnclass= "operatortoken "> = 0
dataAvailable <SPAnclass= "operatortoken "> = True
dataUploaded <SPAnclass= "operatortoken "> = False
dataQuery <SPAnclass= "operatortoken "> = fc_dataAdd.query()
enquanto dataAvailable:
modulo_i = i % 100
se modulo_i == 0 e i != 0 e não dataUploaded:
layer.edit_features(adds=listAddFeatures)
listAddFeatures.clear()
dataUploaded = True
print(str(i) + " Features de " + str(len(dataQuery)) + " adicionadas.")
senão:
tente:
listAddFeatures.append(dataQuery.features[i])
i = i + 1
dataUploaded = False
exceto:
dataAvailable = False
layer.edit_features(adds=listAddFeatures)
print("Todos os " + str(len(dataQuery)) + " Features adicionados.") class="line-numbers-rows"><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><\/SPAN><\/CODE><\/PRE><P><\/P><P style="text-align: justify;">Ao criar um novo Feature Service, existem etapas adicionais antes do upload dos dados, pois é necessário criar um Feature Service vazio com os campos necessários. Para isso, cria-se um novo DataFrame que contém apenas a linha de título do passado. Agora, itera-se por todos os campos existentes e os campos com o tipo de dado "int64" são adicionados a uma nova lista.<\/P><P style="text-align: justify;"><\/P><PRE class="lia-code-sample line-numbers language-none"><CODE>newField = {
"name" : intFieldName,
"type" : "esriFieldTypeInteger",
"alias" : intFieldName,
"sqlType" : "sqlTypeBigInt",
"nullable" : True,
"editable" : True,
"visible" : True
}
token_URL = "{}\/sharing\/generateToken".format(portal)
token_params = {'username' : user,
'password' : password,
'client' : 'referer',
'referer': portal,
'expiration': 60,
'f' : 'json'
}
r = requests.post(token_URL,token_params)
token_obj = r.json()
token = token_obj['token']
expires = token_obj['expires']
tokenExpires = datetime.datetime.fromtimestamp(int(expires)\/1000)
featureLayerAdminUrl = layerURL.replace("\/rest\/", "\/rest\/admin\/")
params = {"f":"json", "token":token}
params["addToDefinition"] = json.dumps({"fields":[newField]})
layerUpdateUrl = "{}\/addToDefinition".format(featureLayerAdminUrl)
layerResult = requests.post(layerUpdateUrl, params)
<SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN)<span class="line-numbers-rows"><span><<EMOJI_32>></span><span><<EMOJI_33>></span><span><<EMOJI_34>></span><span><<EMOJI_35>></span><span><<EMOJI_36>></span><span><<EMOJI_37>></span><span><<EMOJI_38>></span><span><<EMOJI_39>></span><span><<EMOJI_40>></span><span><<EMOJI_41>></span><span><<EMOJI_42>></span><span><<EMOJI_43>></span><span><<EMOJI_44>></span><span><<EMOJI_45>></span><span>. </span></PRE>
<P style="text-align: justify;"></P>
<P style="text-align: justify;">Esta etapa é importante porque ao publicar um Feature Service usando a ArcGIS API for Python, os campos Integer são criados apenas como "int32" e erros ocorrem para valores maiores. Agora, um Feature Service é criado e os campos "int64" são adicionados via uma requisição à Portal API, pois dessa forma valores inteiros maiores podem ser armazenados.<\/P>
<P></P>
<PRE class="lia-code-sample line-numbers language-none"><CODE>for field in listBigInt:
del dataframe_total_title[field]
fc = gis.content.import_data(dataframe_total_title)
item_properties_input = {
"title": title,
"tags" : tags,
"description": description,
"text": json.dumps({"featureCollection": {"layers": [dict(fc.layer)]}}),
"type": "Feature Collection",
}
item = gis.content.add(item_properties_input)
new_item = item.publish()<
Agora o serviço está criado com todos os atributos necessários e as feições podem ser adicionadas em blocos, como na atualização.<\/P>
O resultado é um