Até que ponto a linguagem do SQL é acessível através das ferramentas do ArcGIS?

10

Essa pergunta parece tão redundante ...
De qualquer forma, fui convidado a explorar os usos do SQL no ArcGIS. Usamos um SDE DB para todo o armazenamento do lado do servidor e gerenciamento / edição em larga escala do DB. No entanto, estou tentando aprofundar o quão integrado é o SQL nas ferramentas do ArcGIS. Há uma observação no Guia de referência de consultas SQL da ajuda do ArcGIS 10 que afirma claramente que a sintaxe SQL não funciona ao usar a ferramenta Calculadora de campo. Acho isso muito decepcionante, pois parece muito útil poder extrair e manipular informações diretamente do próprio banco de dados ao calcular valores de campo.

Quais são as maiores limitações e armadilhas em que alguém pode cair ao tentar usar o SQL no ArcGIS? Quais ferramentas veem a melhor funcionalidade quando integradas ao SQL?

Se for necessário um exemplo para tornar essa pergunta mais clara, estou tentando rastrear o número de pontos de interesse de um determinado tipo em uma determinada região. Cada ponto possui um atributo que descreve seu tipo e região. Minha solução atual envolve o uso pesado de cursores para contagem e recuperação de dados, mas um superior apontou que uma simples consulta SQL poderia fazer tudo isso e muito mais. Infelizmente, parece que a funcionalidade não está presente para isso.

Ou é?

Nathanus
fonte
Alguma das tabelas consultadas tem versão?
Michael Todd
Versionado? Acho que não estou familiarizado com esse termo.
Nathanus 22/03/11
1
O controle de versão de uma camada permite fazer alterações na camada, mantendo os recursos anteriores. Portanto, se um recurso é excluído, a versão atual da camada mostra que o recurso não existe mais; no entanto, o recurso ainda existe na camada "base" e as ferramentas GIS podem ser usadas para exibir diferentes versões da camada que mostram o recurso. Você pode saber se a sua camada é versionada clicando com o botão direito do mouse na camada no ArcCatalog e selecionando Propriedades. A parte inferior da guia Geral possui uma seção chamada Controle de versão e as informações aqui informam se a camada está com controle de versão.
22711 Michael Todd

Respostas:

9

Se você deseja usar o Python, dê uma olhada no comando ArcSDESQLExecute . Isso permitirá que você execute SQL arbitrário, mas ele deve ser conectado através do SDE. Se o resultado da consulta for um conjunto de linhas, os atributos serão retornados como uma lista de listas do Python. Caso contrário, ele retornará True se o SQL for executado com êxito ou None se não. Consulte também: Executando SQL usando uma conexão ArcSDE

blah238
fonte
Definitivamente vou fazer isso! Isso parece exatamente o que eu estava procurando, neste contexto. Muito obrigado.
Nathanus 22/03
5

Se você estiver escrevendo ArcObjects personalizados, poderá executar SQL arbitrário em um Espaço de Trabalho SDE usando o método ExecuteSQL . Esse método é limitado a consultas que não retornam conjuntos de resultados, como INSERT, UPDATE ou alguns procedimentos armazenados.

Se você estiver trabalhando na interface do ArcMap, suas opções são um pouco mais limitadas. O motivo pelo qual você não pode usar SQL através do campo Calcular é porque a expressão é realmente VBScript e / ou Python. Você poderia usar VBScript ou Python para executar uma expressão SQL arbitrária e extrair valores do cursor resultante, mas eu não recomendo.

Como alternativa, você pode usar a resposta de Regan e criar uma Camada de consulta. Para dados somente leitura, esta é sua melhor abordagem. Se você precisar atualizar os dados, é um pouco mais complicado. Você precisará criar uma camada de consulta com seus "novos" valores, realizar uma junção na tabela existente e, em seguida, usar os campos de cálculo. Isso pode ser combinado com o ExecuteSQL para executar atualizações complexas e exibir os resultados (meio desajeitado).

Sua última alternativa é executar o SQL nas tabelas do ArcSDE diretamente.

James Schek
fonte
1
Seu último ponto (executando o SQL diretamente nas tabelas) foi o motivo pelo qual fiz minha pergunta sobre versão. Uma consulta SQL no nível do banco de dados é extraída apenas da camada base (a menos que você configure uma exibição com várias versões), para que não funcione se a camada for versionada.
Michael Todd
O trabalho que estou fazendo é principalmente em Python, mas parece cada vez mais que a funcionalidade real na interface do usuário depende do ArcObjects.
Nathanus 22/03
Tudo é construído internamente no ArcObjects, incluindo a funcionalidade python.
James Schek
se o ArcSDESQLExecute em Python pode retornar resultados, como o mesmo pode ser alcançado através do IWorkspace.ExecuteSQL?
Petr Krebs
@ Peter você não pode diretamente ... Eu atualizei minha resposta.
James Schek
1

Dependendo do RDBMS que você está usando, você pode aproveitar as bibliotecas SQL fora do ArcObjects ou do arcpy, desde que não dependa da recuperação dos dados dos recursos. Muitas das consultas no banco de dados do SQL Server que eu uso diariamente não são de natureza espacial, portanto, usarei as classes System.Data dentro do .NET ou a biblioteca Python pymssql dentro dos aplicativos Python. Se você precisar do uso de dados espaciais, as Camadas de consulta serão sua melhor aposta. A única ressalva com as Camadas de consulta é que elas funcionam apenas com dados armazenados usando tipos de dados espaciais (não o tipo SDEBINARY padrão).

SagebrushGIS
fonte
Isso está começando a ficar intenso. Acho que preciso avaliar mais cuidadosamente minhas necessidades. Não precisarei de dados "espaciais", se com isso você quer dizer coisas como os polígonos e os próprios pontos / linhas, mas simplesmente valores nos campos texto / número inteiro.
Nathanus 22/03
Se você precisar retornar tipos de geometria, eu usaria o acesso a dados ArcObjects / arcpy padrão. Se tudo o que você está fazendo é acessar dados "tabulares" (sem tipos espaciais envolvidos), basta fazer chamadas ao banco de dados usando SqlConnections regulares (para SQL Server - seu tipo de conexão pode variar). Os resultados são mais flexíveis do que o que você obtém do ICursor. Se eu entendi sua pergunta e você está limitado a usar a calculadora de campo, não poderá usar SQL bruto.
precisa