OSM API<\/A> opvraagt.<\/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 class=\"punctuation token\">{<\/<SPAN><SPAN class=\"punctuation token\">}<\/<SPAN> \n tags <SPAN class=\"operator token\">=<
[</span>element<span class=punctuation-token>[</span><span class=string-token>tags</span><span class=punctuation-token>]]</span>
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">als</SPAN> <SPAN class="string token">"user"</SPAN> <SPAN class="keyword token">in</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 style="white-space: pre;"> </span><SPAN class="keyword token">als</SPAN> <SPAN class="string token">"timestamp"</SPAN> <SPAN class="keyword token">in</SPAN> attributes<SPAN class="punctuation token">:</SPAN>
<span style="white-space: pre;"> </span><span style="white-space: pre;"> </span><span style="white-space: pre;"> </span><span style="white-space: pre;"> </span><span style="white-space: pre;"> </span><span style="white-space: pre;"> </span><span style="white-space: pre;"> </span><span style="white-space: pre;"> </span><span style="white-space: pre;"> </span><span style="white-space: pre;"> </span><span style="white-space: pre;"> </span><span style="white-space: pre;"> </span><SPAn class="keyword token">als</SPAn> <SPAn class="string token">"timestamp"</SPAn> <SPAn class="keyword token">in</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 class="keyword token">behalve</SPAn><SPAn class="punctuation token">:</SPAn>
print<SPAn class="punctuation token">(</SPAn><SPAn class="string token">"Node voor dit element niet beschikbaar"</SPAn><SPAn class="punctuation token">)</SPAn>
dictElement<SPAn class="punctuation token">[</SPAn><SPAn class="string token">"attribute"</SPAn><SPAn class="punctuation token">]</SPAn> <SPAn class="operator token">=</SPAn> key_cat <SPAn class="operator token">+</SPAn> <SPAn class="string token">"-"</SPAn> <SPAn class="operator token">+</SPAn> val_cat
dictData<SPAn class="punctuation token">.</SPAn>append<SPAn class="punctuation token">(</SPAn>dictElement<SPAn class="punctuation token">)</SPAn><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></SPAN><SPAN></SPAN><SPAN></SpanS>AnGleS<<eMoJi_23>><<EmOjI_24>><<EmOjI_25>><<EmOjI_26>><<EmOjI_27>><<EmOjI_28>><<EmOjI_29>>
Deze gegevens worden nu gestructureerd in een dictionary, omgezet in een pandas DataFrame en teruggegeven voor verder gebruik. In een tweede <A href="https://github.com/EsriDE/EsriDE-python-osm2arcgis/blob/master/agolconfig.json" rel="nofollow noopener noreferrer" target="_blank">JSON-bestand</A> worden de configuraties voor ArcGIS Online of ArcGIS for Portal ingesteld.
<P style='text-align:center;'><IMG src='https://us.v-cdn.net/6038851/uploads/legacyfs/online/390887_pastedImage_3.png' alt='' style='width:auto;height:auto;' /></P>
Wanneer de benodigde gegevens aanwezig zijn, worden deze gecontroleerd op juistheid. Dit betekent dat er verbinding wordt gemaakt met behulp van de logingegevens. Dit is nodig om te garanderen dat de Feature Service ID correct is wanneer deze overschreven moet worden. Als de invoer volledig en correct is, wordt een ander <A href='https://github.com/EsriDE/EsriDE-python-osm2arcgis/blob/master/DataToAGO.py' rel='nofollow noopener noreferrer' target='_blank'>Python-script </A>gestart. Bij het bijwerken van een Feature Service wordt deze geleegd, wordt de DataFrame in blokken verdeeld en worden telkens 100 features toegevoegd aan de Feature Service.
listAddFeatures <Span Class='operator Token'>=</Span> <Span Class='Punctuation Token'>[</Span ><Span Class='Punctuation Token'>]</Span >
i <Span Class='Operator Token'>=</Span > 0
dataAvailable <Span Class='Operator Token'>=</Span > True
dataUploaded <Span Class='Operator Token'>=</Span > False
dataQuery <Span Class='Operator Token'>=</Span > fc_dataAdd.query()
<span style='white-space:pre;'>while dataAvailable:</span>
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) + " features van " + str(len(dataQuery)) + " toegevoegd.")
else:
try:
listAddFeatures.append(dataQuery.features[i])
i = i + 1
dataUploaded = False
except:
dataAvailable = False
layer.edit_features(adds=listAddFeatures)
print("Alle " + str(len(dataQuery)) + " features toegevoegd.") 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;">Bij het aanmaken van een nieuwe Feature Service zijn er voor het uploaden van de gegevens nog extra stappen nodig, want er moet een lege Feature Service met de benodigde velden worden aangemaakt. Hiervoor maakt men een nieuw DataFrame aan, dat alleen de titelrij van het overgedragen bevat. Vervolgens wordt door alle aanwezige velden geïtereerd en worden de velden met het datatype "int64" toegevoegd aan een nieuwe lijst.<\/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>
Deze stap is belangrijk, want bij het publiceren van een Feature Service via de ArcGIS API for Python worden Integer velden alleen als "int32" aangemaakt en bij hogere waarden treden fouten op. Nu wordt een Feature Service aangemaakt en worden de "int64" velden via een verzoek aan de Portal API toegevoegd, omdat op deze manier hogere Integerwaarden kunnen worden opgeslagen.<\/P>
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()<
Nu is de service met alle benodigde attributen aangemaakt en kunnen de features in blokken, zoals bij de update, worden toegevoegd.<\/P>
Het resultaat is een