Hi,
We are using Arcgis Runtime SDK for Qt 10.2.6 and Qt 5.4.2 (MSVC 2013, 32 bit) Qt Creator QT\QML side .We have local editing application which edits features within an offline geodatabase and sync back to the service.We are using GeodatabaseSyncTask class's generateGeodatabase (GenerateGeodatabaseParameters parameters, string filename) method to generate geodatabase.
Can I generate geodatabese using without GenerateGeodatabaseParameters's extent property ? can I generate using only layerIds or layerQueries properties ?
I'm tried to generate witout extent propery with using only layerIds and layerQueries but when I can not generate , here is the console output below:
D/MaksMobil(30477): qrc:/qml/MapNumarataj.qml:291 (onGenerateStatusChanged): qml: Generate Error messageFailed to parse geometry from input JSONcode400
Best Regards
Solved! Go to Solution.
extent/geometry is a required parameter from the rest api, so you will need to provide it - Create Replica - Feature Service (Operation) - ArcGIS
extent/geometry is a required parameter from the rest api, so you will need to provide it - Create Replica - Feature Service (Operation) - ArcGIS
Thanks Lucas,
Can we generate geodatabese only within poligon geometry not within poligon geometry envelope using with GeodatabaseSyncTask class's generateGeodatabase, Can we use generateGeodatabaseParameters.extent=polygon; line of code , not generateGeodatabaseParameters.extent=polygon.queryEnvelope(); line of code ?
Thanks
I believe that should work, as it takes a Geometry - ArcGIS Runtime SDK for Qt QML API: GenerateGeodatabaseParameters Class Reference
Hi Lucas ,
I try to generate with poligon (generateGeodatabaseParameters.extent=polygon) wich has more than one point but gives error when I generate .How can we solve this problem ?
Here is the console output below :
D/MaksMobil(21826): qrc:/qml/MapNumarataj.qml:293 (onGenerateStatusChanged): qml: Generate Error messageError downloading http://......./arcgis/rest/services/ADRES27/FeatureServer/createReplica?async=true&clientTime=1470763815637&dataFormat=sqlite&geometry=%7B%22rings%22:[[[3020466.09516246,4640153.3807131],[3020482.83722159,4640176.85367551],[3020526.18356831,4640237.62827268],[3020617.40875565,4640170.60837935],[3020608.96692701,4640162.67623181],[3020625.20794716,4640131.69018741],[3020622.89849908,4640131.04941413],[3020697.7013947,4639990.20336442],[3020718.4496007,4639951.13879008],[3020740.39523979,4639909.82314925],[3020747.81624781,4639895.80642545],[3020776.48003011,4639841.69178895],[3020797.89121854,4639801.26666006],[3020833.9130704,4639733.24342986],[3020869.70525637,4639665.66376684],[3020871.54603324,4639662.19201904],[3020880.52103087,4639645.23570479],[3020908.33480733,4639594.39883371],[3020950.42257043,4639529.47891321],[3020951.16372939,4639516.10542839],[3020948.52703761,4639475.598364
D/MaksMobil(21826): qrc:/qml/MapNumarataj.qml:293 (onGenerateStatusChanged): qml: Generate Error messageProtocol "" is unknowncode301
Taner,
The following code works for me, so in general, it does work to have a polygon as your extent in the generate task
import QtQuick 2.3 import QtQuick.Controls 1.2 import QtQuick.Controls.Styles 1.2 import ArcGIS.Extras 1.0 import ArcGIS.Runtime 10.26 ApplicationWindow { id: root width: 700 height: width property double scaleFactor: System.displayScaleFactor property int fontSize: 15 * scaleFactor property bool isOnline: true property string featuresUrl: "http://sampleserver6.arcgisonline.com/arcgis/rest/services/Sync/WildfireSync/FeatureServer" property string gdbPath: "~/ArcGIS/Runtime/Data/Test/offlineSample.geodatabase" property var selectedFeatureId: null Envelope { id: sfExtent xMin: -13643665.582273144 yMin: 4533030.152110769 xMax: -13618899.985108782 yMax: 4554203.2089457335 spatialReference: mainMap.spatialReference } Polygon { id: samplePolygon } Map { id: mainMap anchors.fill: parent focus: true ArcGISTiledMapServiceLayer { url: "http://services.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Base/MapServer" } FeatureLayer { id: offLineLayer featureTable: root.isOnline ? featureServiceTable : local selectionColor: "cyan" function hitTestFeatures(x,y) { var tolerance = Qt.platform.os === "ios" || Qt.platform.os === "android" ? 4 : 1; var featureIds = offLineLayer.findFeatures(x, y, tolerance * scaleFactor, 1); if (featureIds.length > 0) { selectedFeatureId = featureIds[0]; selectFeature(selectedFeatureId); statusText.text = "Tap anywhere to move the feature"; } } } GraphicsLayer { id: graphicsLayer } onMouseClicked: { if (!root.isOnline) { if (offLineLayer.isFeatureSelected(selectedFeatureId)) { var featureToEdit = offLineLayer.featureTable.feature(selectedFeatureId); featureToEdit.geometry = mouse.mapPoint; offLineLayer.featureTable.updateFeature(selectedFeatureId, featureToEdit); offLineLayer.unselectFeature(selectedFeatureId); selectedFeatureId = null; syncButton.enabled = true; statusText.text = "Tap on Sync to update the Feature Service with the edits"; } else offLineLayer.hitTestFeatures(mouse.x, mouse.y); } } onStatusChanged: { if (status === Enums.MapStatusReady) { samplePolygon.startPath(-7994031.11, 5092024.86); samplePolygon.lineTo(-7992530.05, 4952426.28); samplePolygon.lineTo(-7864939.95, 4951675.75); samplePolygon.lineTo(-7831916.63, 5069508.96); samplePolygon.lineTo(-7832667.16, 5166327.33); samplePolygon.lineTo(-7864189.42, 5233124.5); samplePolygon.lineTo(-7897963.27, 5071010.02); samplePolygon.lineTo(-7969263.62, 5131052.42); samplePolygon.lineTo(-8045817.68, 5119043.94); samplePolygon.lineTo(-8057826.16, 5045492); var graphicClone = polygonGraphic.clone(); graphicClone.geometry = samplePolygon; graphicsLayer.addGraphic(graphicClone); } } Graphic { id: polygonGraphic symbol: SimpleFillSymbol { color: Qt.rgba(0.5, 0, 0.0, 0.25) outline: SimpleLineSymbol { color: "red" style: Enums.SimpleLineSymbolStyleSolid width: 2 } } } GeodatabaseFeatureTable { id: local geodatabase: gdb.valid ? gdb : null featureServiceLayerId: 0 } GeodatabaseFeatureServiceTable { id: featureServiceTable url: featuresUrl + "/0" } ServiceInfoTask { id: serviceInfoTask url: featuresUrl onFeatureServiceInfoStatusChanged: { if (featureServiceInfoStatus === Enums.FeatureServiceInfoStatusCompleted) { statusText.text = "Service info received. Tap on the Generate Geodatabase Button"; generateButton.enabled = true; } else if (featureServiceInfoStatus === Enums.FeatureServiceInfoStatusErrored) { statusText.text = "Error:" + errorString; generateButton.enabled = false; cancelButton.text = "Start Over"; } } } Feature { id: featureToEdit } Rectangle { anchors { fill: controlsColumn margins: -10 * scaleFactor } color: "lightgrey" radius: 5 * scaleFactor border.color: "black" opacity: 0.77 MouseArea { anchors.fill: parent onClicked: (mouse.accepted = true) } } Column { id: controlsColumn anchors { left: parent.left top: parent.top margins: 20 * scaleFactor } spacing: 7 Button { id: generateButton text: "Generate Geodatabase" enabled: false style: ButtonStyle { label: Text { text: control.text color: control.enabled ? "black" : "grey" horizontalAlignment: Text.AlignHCenter } } onClicked: { generateGeodatabaseParameters.initialize(serviceInfoTask.featureServiceInfo); generateGeodatabaseParameters.extent = samplePolygon; generateGeodatabaseParameters.returnAttachments = false; statusText.text = "Starting generate geodatabase task"; geodatabaseSyncTask.generateGeodatabase(generateGeodatabaseParameters, gdbPath); } } Button { id: syncButton text: "Sync" width: generateButton.width enabled: false style: generateButton.style onClicked: { enabled = false; geodatabaseSyncTask.syncGeodatabase(gdb.syncGeodatabaseParameters, gdb); statusText.text = "Starting sync task"; } } Button { id: cancelButton text: "Cancel" width: generateButton.width enabled: false style: generateButton.style onClicked: { geodatabaseSyncTask.cancelJob(syncStatusInfo); enabled = false; text = "Cancel"; } } Row { id: toggleOnlineOffline spacing: 10 Text { id: onlineStatus text: root.isOnline ? " Online " : " Offline " color: "black" } Switch { id: switchToggle checked: root.isOnline enabled: false onCheckedChanged: { root.isOnline = checked; if (checked === true && Enums.GenerateStatusCompleted) statusText.text = "Switch to Offline Mode to continue editing."; else if (checked === false && Enums.GenerateStatusCompleted) statusText.text = "Select a feature."; } } } } Geodatabase { id: gdb path: geodatabaseSyncTask.geodatabasePath onValidChanged: { if (valid) { var gdbtables = gdb.geodatabaseFeatureTables; for(var i in gdbtables) { console.log (gdbtables.featureServiceLayerName); } } } } GeodatabaseSyncStatusInfo { id: syncStatusInfo } GeodatabaseSyncTask { id: geodatabaseSyncTask url: featuresUrl onGenerateStatusChanged: { if (generateStatus === Enums.GenerateStatusCompleted) { statusText.text = geodatabasePath; cancelButton.enabled = false; generateButton.enabled = false; root.isOnline = false; statusText.text = "Select a feature"; } else if (generateStatus === GeodatabaseSyncTask.GenerateError) { statusText.text = "Error: " + generateGeodatabaseError.message + " Code= " + generateGeodatabaseError.code.toString() + " " + generateGeodatabaseError.details; generateButton.enabled = false; cancelButton.text = "Start Over"; } } onGeodatabaseSyncStatusInfoChanged: { if (geodatabaseSyncStatusInfo.status === Enums.GeodatabaseStatusUploadingDelta) { var deltaProgress = geodatabaseSyncStatusInfo.deltaUploadProgress/1000; var deltaSize = geodatabaseSyncStatusInfo.deltaSize/1000; statusText.text = geodatabaseSyncStatusInfo.statusString + " " + String(deltaProgress) + " of " + String(deltaSize) + " KBs..."; } else statusText.text = geodatabaseSyncStatusInfo.statusString + "..."; if (geodatabaseSyncStatusInfo.status !== GeodatabaseSyncStatusInfo.Cancelled) cancelButton.enabled = true; syncStatusInfo.json = geodatabaseSyncStatusInfo.json; } onSyncStatusChanged: { featureServiceTable.refreshFeatures(); if (syncStatus === Enums.SyncStatusCompleted) { cancelButton.enabled = false; syncButton.enabled = false; statusText.text = "Sync completed. You may continue editing the features."; switchToggle.enabled = true; } if (syncStatus === Enums.SyncStatusErrored) statusText.text = "Error: " + syncGeodatabaseError.message + " Code= " + syncGeodatabaseError.code.toString() + " " + syncGeodatabaseError.details; } } GenerateGeodatabaseParameters { id: generateGeodatabaseParameters } Rectangle { id: textStatusRectangle anchors { fill: statusText margins: -10 * scaleFactor } visible: statusText.text.length > 0 color: "lightgrey" radius: 5 border.color: "black" opacity: 0.77 } Text { id: statusText anchors { left: parent.left right: parent.right bottom: parent.bottom margins: 20 * scaleFactor } wrapMode: Text.WordWrap color: "black" } Rectangle { anchors.fill: parent color: "transparent" border { width: 0.5 * scaleFactor color: "black" } } Component.onCompleted: { statusText.text = "Getting service info"; serviceInfoTask.fetchFeatureServiceInfo(); } } }
Hi Lucas ,
Thanks for example code , works fine but in my example have more then 1000 or 2000 point. Can you try to set over 1000 or 2000 point in polygon maybe there can be limitation points or request limitt in polgon when we query during the generate geodatabas.How can I solve this urgent problem ?
Thanks