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
