Como consultar todos os registros (> 1000) e exportar para csv?

13

Eu postei no fórum arcgis, mas nunca recebi nenhuma resposta. Alguém pode me dizer como resolver isso?

Suponha que você tenha um registro de rastreamento de veículos de 1º a 31 de dezembro com informações sobre a velocidade do vento. Todos os dados são salvos no geodatabase (sde-sqlserver) e no ArcGIS Server 10.1 como camada de recurso. Um controle deslizante de tempo mostra a localização de um carro com velocidade do vento.

Quando um usuário altera um intervalo de tempo (por exemplo, 2 de outubro a 4 de outubro), a primeira tarefa de consulta (por contagem) calcula o número de recursos dentro do intervalo. Geralmente, existem mais de 1000 resultados até dois dias (por exemplo, 1750) (embora não queira alterar esse limite).

Usei outra tarefa de consulta (executeforIds) para manter todos os registros em mãos, mas reduzi a quantidade com o módulo (1/10), que ainda é o número suficiente para fazer um bom gráfico para uma tendência geral da velocidade do vento. No entanto, também quero fornecer uma opção para baixar um conjunto de dados inteiro em csv (neste caso, 1750 linhas)

Aqui, usei o findtask para recuperar o conjunto de dados de atributos dentro do intervalo de tempo.

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));

O csvdata não foi definido em console.log2, embora todos os csvdata (no console.log1) mostrem dados no console. O problema parece que o tempo de find.execute foi concluído, então eu adicionei setTimeout.

Isso parece funcionar, mas quando eu aumento o intervalo de tempo, obviamente não funcionará.

Existe uma maneira de manter todos os registros (1000 - 200.000) em um intervalo de tempo específico e exportar para csv?

user14693
fonte

Respostas:

6

Uma das opções é fazer com que o sistema retorne os registros para você. Ele fornecerá os números de registro para todas as 1750 linhas, mesmo retornando os dados para 1000.

Quando você obtiver a lista de registros (não tenho certeza se eles estão classificados), retire os primeiros 1000 e adicione o primeiro e o último OBJECTIDs à ​​cláusula where

OBJECTID>=firstobjectid and  OBJECTID<=lastobjectid

Repita quantas vezes for necessário.

mhoran_psprep
fonte
6

Eu sugeriria usar o QueryTask e definir returnIdsOnly = true .

Observe que, embora exista um limite no número de recursos incluídos na resposta do conjunto de recursos, não há limite no número de IDs de objetos retornados na resposta da matriz de IDs. Os clientes podem explorar isso para obter todos os IDs de objeto em conformidade com a consulta, especificando returnIdsOnly = true e solicitando subseqüentemente conjuntos de recursos para subconjuntos de IDs de objeto.

Isso pode ser encontrado no QueryTask da API Javascript .

Também é suportado na consulta da API do Silverlight .

Se você estiver usando tipos de dados espaciais nativos do SQL Server e não usar controle de versão, considere apenas escrever um serviço REST da Microsoft usando o modelo como ponto de partida.

Kirk Kuykendall
fonte
Não percebi isso - legal! Na primeira linha, você quis dizer returnIdsOnly = true, certo?
awesomo
Opa, isso é verdade, mudei minha resposta agora.
precisa saber é o seguinte
Obrigado Kirk. Eu sabia "returnIdsOnly = true" na API do Sliverlight, mas não consegui encontrar na API Javascript, como você mencionou. Vou verificar o MS REST.
user14693
5
  1. Certamente, você pode aumentar o limite de registros de serviço para 10k ou mais se estiver lidando com pontos e dois atributos - principalmente se não estiver gerando gráficos.

  2. Você pode fazer uma tarefa de geoprocessamento assíncrono e coletar os dados depois de gerados em uma pasta de saída no servidor.

  3. Se você jogar se uma ordem por cláusula e o tempo em sua consulta. Você pode ler a hora no último registro e obter o próximo conjunto de registros maior que esse tempo. Continue até chegar ao final do seu período.

awesomo
fonte