Comment interroger tous les enregistrements (> 1000) et exporter vers csv?


13

J'ai posté sur le forum arcgis mais je n'ai jamais eu de réponse. Quelqu'un peut-il me dire comment résoudre ce problème?

Supposons que vous ayez un dossier de suivi de véhicule du 1er octobre au 31 décembre avec des informations sur la vitesse du vent. Toutes les données sont enregistrées dans la géodatabase (sde-sqlserver) et mises à jour dans ArcGIS Server 10.1 en tant que couche d'entités. Un curseur temporel indique l'emplacement d'une voiture avec la vitesse du vent.

Lorsqu'un utilisateur modifie une plage de temps (par exemple, du 2 octobre au 4 octobre), la première tâche de requête (pour le comptage) calcule le nombre de fonctionnalités dans la plage. Il y a généralement plus de 1000 résultats, même sur deux jours (par exemple 1750) (je ne veux cependant pas modifier cette limite).

J'ai utilisé une autre tâche de requête (executeforIds) pour garder tous les enregistrements en main, mais réduire le montant avec le module (1/10), ce qui est encore assez pour créer un joli graphique pour une tendance générale de la vitesse du vent. Cependant, je veux également fournir une option pour télécharger un ensemble de données complet en csv (dans ce cas 1750 lignes)

Ici, j'ai utilisé findtask pour récupérer l'ensemble de données d'attribut dans la plage de temps.

try {
    //console.log(app.objIDs);
    var attribs;
    csvdata = "";

    var find = new esri.tasks.FindTask("http://xyz.com/arcgis/rest/services/Realtime/Car_Wind_WM/MapServer");
    var params = new esri.tasks.FindParameters();
    params.layerIds = [0];
    params.searchFields = ["OBJECTID"];

    for (var i = 0; i < app.objIDs.length; i++) {
        params.searchText = app.objIDs[i];
        find.execute(params, function (results) {
            attribs = results[0].feature.attributes;
            csvdata += attribs.Date_Central + ',' + attribs.Longitude + "," + attribs.Latitude + "," + attribs.windspeed + "\n";
            console.log(csvdata); //1
        }, function (error) {
            alert("Error");
        });
    }
} catch (error) {
    alert("Change the time range first");
}
console.log(csvdata); //2
setTimeout(function () {
    formatData(app.csvdata);
}, (3 * 1000));

csvdata n'était pas défini dans console.log2, bien que tous les csvdata (dans console.log1) affichent des données dans la console. Le problème semble que le timing de find.execute soit terminé, j'ai donc ajouté setTimeout.

Cela semble fonctionner mais quand j'augmente la plage de temps, ce ne sera évidemment pas le cas.

Est-il possible de conserver tous les enregistrements (1000 - 200 000) dans une plage de temps spécifique et d'exporter vers csv?

Réponses:


6

L'une des options consiste à demander au système de vous renvoyer les enregistrements. Il vous donnera les numéros d'enregistrement pour toutes les 1750 lignes même s'il ne renverra que les données pour 1000.

Lorsque vous obtenez la liste des enregistrements (je ne sais pas s'ils sont triés), retirez les 1000 premiers, puis ajoutez les premier et dernier OBJECTID à la clause de lieu

OBJECTID>=firstobjectid and  OBJECTID<=lastobjectid

Répétez autant de fois que nécessaire.


6

J'allais suggérer d'utiliser la QueryTask et de définir returnIdsOnly = true .

Notez que bien qu'il existe une limite sur le nombre de fonctionnalités incluses dans la réponse du jeu de fonctionnalités, il n'y a pas de limite sur le nombre d'ID d'objet retournés dans la réponse du tableau d'ID. Les clients peuvent exploiter cela pour obtenir tous les ID d'objet conformes à la requête en spécifiant returnIdsOnly = true et en demandant par la suite des ensembles de fonctionnalités pour des sous-ensembles d'ID d'objet.

Cela peut être trouvé dans QueryTask de l'API Javascript .

Il est également pris en charge dans la requête de l'API Silverlight .

Si vous utilisez des types de données spatiaux de serveur SQL natif et que vous n'utilisez pas le contrôle de version, vous pouvez envisager d'écrire simplement un service Microsoft REST en utilisant le modèle comme point de départ.


Je ne m'en suis pas rendu compte - sympa! Dans la première ligne, vous vouliez dire returnIdsOnly = true non?
awesomo

Oups, c'est vrai, j'ai changé ma réponse maintenant.
Kirk Kuykendall

Merci Kirk. Je connaissais "returnIdsOnly = true" dans l'API Sliverlight mais je n'ai pas pu trouver dans l'API Javascript comme vous l'avez mentionné. Je vais vérifier le MS REST.
user14693

5
  1. Vous pouvez certainement augmenter la limite d'enregistrement de service à 10 000 ou plus si vous traitez avec des points et des attributs de couple - en particulier si vous ne générez pas de graphiques.

  2. Vous pouvez créer une tâche de géotraitement asynchrone et récupérer les données une fois générées dans un dossier de sortie sur le serveur.

  3. Si vous jetez si une clause order by et l'heure dans votre requête. Vous pourrez peut-être lire l'heure dans le dernier enregistrement et obtenir le prochain ensemble d'enregistrements supérieur à cette heure. Continuez jusqu'à ce que vous atteigniez la fin de votre plage horaire.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.