OSM API<\/A>.<\/P><\/P>
response <SPAN class="operator token">=<\/<SPAN> api<SPAN class="punctuation token">.<\/<SPAN>Get<SPAN class="punctuation token">(<\/<SPAN>'node['<SPAN class="operator token">+<\/<SPAN> category <SPAN class="operator token">+<\/<SPAN> '](<'<SPAN class="operator token">+<\/<SPAN> minLat <SPAN class="operator token">+<\/<SPAN> ','<SPAN class="operator token">+<\/<SPAN> minLon <SPAN class="operator token">+<\/<SPAN> ','
<SPAN class="operator token">+<\/<SPAN> maxLat <SPAN class="operator token">+<\/<SPAN> ','<SPAN class="operator token">+<\/<SPAN> maxLon <SPAN class="operator token">+<\/<SPAN> ')'<SPAN class="punctuation token">,<\/<SPAN> responseformat<SPAN class="operator token">=<\/<SPAN>"json"<SPAN class="punctuation token">)<\/<SPAN>
elements <SPAN class="operator token">=<\/<SPAN> response<SPAN class="punctuation token">[<\/<SPAN>"elements"<SPAN class="punctuation token">]<\/<SPAN>
<SPAN class="keyword token">for<\/<SPAN> element <SPAN class="keyword token">in<\/<SPAN> elements<SPAN class="punctuation token">:<\/<SPAN>
dictElement <SPAN class="operator token">=<\/<SPAN> <SPAN class="punctuation token">{<\/<SPAN>}<span>
 .& nbsp; & nbsp; & nbsp; & nbsp; tags <span>=</span> [element["tags"]]
& nbsp; & nbsp; & nbsp; & nbsp; tags = tags[0]
& nbsp; & nbsp; & nbsp; & nbsp; for key_att in attributes:
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; val_att = attributes[key_att]
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; if val_att in tags:
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; dictElement[key_att] = tags[val_att]
& nbsp; & nbsp; & nbsp; & nbsp; id = element["id"]
& nbsp; & nbsp; & nbsp; & nbsp;
& nbsp; & nbsp; & nbsp; & nbsp;
} <SPAN class="keyword token">pokud</SPAN> <SPAN class="string token">"user"</SPAN> <SPAN class="keyword token">v</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">pokud</SPAN> <SPAN class="string token">"timestamp"</SPAN> <SPAN class="keyword token">v</SPAN> attributes<SPAN class="punctuation token">:</SPAN>
<span style="white-space: pre;"> </span><SPAN class="keyword token">pokud</SPAN> <SPAN class="string token">"timestamp"</SPAN> <SPAN class="keyword token">v</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">kromě</SPAN><SPAN class="punctuation token">:</SPAN>
<span style="white-space: pre;"> </span><SPAnclass="keyword token">print</SPAn><SPAnclass="punctuation token">(</SPAn><SPAnclass="string token">"Node pro tento prvek není k dispozici"</SPAn><SPAnclass="punctuation token">)</SPAn>
dictElement<SPAnclass="punctuation token">[</SPAn><SPAnclass="string token">"attribute"</SPAn><SPAnclass="punctuation token"]></SPAn> <SPAnclass="operator token">=</SPAn> key_cat <SPAnclass="operator token ">+</ SPAn > "-" <SPAnclass = "operator token ">+ </ SPAn > val_cat
dictData.append(dictElement)<span 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 >< < EM O J I _ 2 0 > > </ s p a n > < s p a n > < < E M O J I _ 2 1 > > </ s p a n > < s p a n > < < E M O J I _ 2 2 > > </ s p a n > < s p a n > < < E M O J I _ 2 3 > > </ s p a n > < s p a n > < < E M O J I _ 2 4 > > </ s p a n > < s p a n > < < E M O J I _ 2 5 > > </ s p a n > < s p a n > < < E M O J I _ 2 6 > > </ s p a n > < s p a n > < < E M O J I _ 2 7 > > </ s p a n > < s p a n > < < E M O J I _ 2 8 > > </ s p a n > < s p a n > < < E M O J I _ 2 9 > ></ span ></ CODE ></ PRE >< P style = "text-align: center;" >< / P >< P style = "text-align: justify;" >& nbsp;Tato data jsou nyní strukturována v dictionary, převedena do pandas DataFrame a vrácena pro další použití.V druhém <A href = "https://github.com/EsriDE/EsriDE-python-osm2arcgis/blob/master/agolconfig.json" rel = "nofollow noopener noreferrer" target = "_blank" > JSON souboru </A> jsou nastaveny konfigurace pro ArcGIS Online nebo ArcGIS for Portal.< / P >< P >< / P >< P style = "text-align: 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;" / >< / P >< P >< / P >< P style = "text-align: justify;" >Pokud jsou potřebná data k dispozici, jsou ověřena jejich správnost. To znamená, že je navázáno připojení pomocí přihlašovacích údajů. To je nutné k zajištění správnosti Feature Service ID, pokud má být přepsán. Pokud je vstup kompletní a správný, spustí se další <A href = "https://github.com/EsriDE/EsriDE-python-osm2arcgis/blob/master/DataToAGO.py" rel = "nofollow noopener noreferrer" target = "_blank" > Python skript </A>. Při aktualizaci Feature Service je tento vyprázdněn, DataFrame je rozdělen na bloky a po 100 prvcích je přidán do Feature Service.< / P >< P >< / P >< PRE class = "lia-code-sample line-numbers language-none"><CODE>listAddFeatures = []
i = 0
dataAvailable = True
dataUploaded = False
dataQuery = fc_dataAdd.query()
while dataAvailable:
modulo_i = i % 100
if modulo_i == 0 and i != 0 and not dataUploaded:
layer.edit_features(adds=listAddFeatures)
listAddFeatures.clear()
dataUploaded = True
print(str(i) + " prvků z " + str(len(dataQuery)) + " přidáno.")
else:
try:
listAddFeatures.append(dataQuery.features[i])
i += 1
dataUploaded = False
except:
dataAvailable = False
layer.edit_features(adds=listAddFeatures)
print("Všechny " + str(len(dataQuery)) + " prvky přidány.")<<EMOJI_30> 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;">Při vytváření nového Feature Services je před nahráním dat potřeba provést další kroky, protože je nutné založit prázdný Feature Service s požadovanými poli. K tomu se vytvoří nový Dataframe, který obsahuje pouze záhlaví předaného souboru. Nyní se iteruje přes všechna dostupná pole a pole s datovým typem „int64“ se přidají do nového seznamu.<\/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></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 > << EMOJI _46 >> < / SPAN > < SPAN > << EMOJI _47 >> < / SPAN > < SPAN > << EMOJI _48 >> < / SPAN > < SPAN > << EMOJI _49 >> < / SPAN > < SPAN > << EMOJI _50 >> < / SPAN > < SPAN > << EMOJI _51 >> < / SPAN > < SPAN > << EM O J I _52>> </SP A N ><S P A N >< E M O J I _53>> </S P A N ><S P A N >< E M O J I _54>> </S P A N ><S P A N >< E M O J I _55>> </S P A N ><S P A N >< E M O J I _56>> </S P A N ><S P A N >< E M O J I _57>> </S P A N ><S P A N >< E M O J I _58>> </S P A N ><S P A N >< E M O J I _59>> </S P A N >Tento krok je důležitý, protože při publikování Feature Services pomocí ArcGIS API for Python jsou celočíselná pole vytvořena pouze jako „int32“ a u vyšších hodnot dochází k chybám. Nyní se vytvoří Feature Service a pole „int64“ se přidají pomocí požadavku na Portal API, protože tímto způsobem lze uložit vyšší celočíselné hodnoty.<\/P >
<\/P >
for field in listBigInt: