Mais

SQL Server equivalente ao Arcmap Intersect para polígonos?


Eu tenho três conjuntos diferentes de conjuntos de dados GEOMETRY Polygon no SQL Server que se sobrepõem completamente. Preciso criar um novo conjunto de dados que tenha um polígono para cada área exclusiva das três camadas. Então, no final das contas, preciso de muitas peças do quebra-cabeça.

E eu preciso fazer isso no SQL Server, não em algo como ArcMap.

Alguma pista?


Os documentos de ajuda do Microsoft Developer Network parecem promissores. Aqui está um exemplo da ajuda para testar a interseção:

DECLARE @ geom1 geometry; DECLARE @ geom2 geometry; DECLARE @result geometry; SELECT @ geom1 = GeomCol1 FROM SpatialTable WHERE id = 1; SELECT @ geom2 = GeomCol1 FROM SpatialTable WHERE id = 2; SELECT @result = @ geom1.STIntersection (@ geom2); SELECT @ result.STAsText ();

Parece que você pode fazer todos os tipos de operações geométricas


Mapas (Construtor de Relatórios e SSRS)

Para visualizar dados de negócios em um contexto geográfico, você pode adicionar um mapa ao seu relatório paginado do Reporting Services. O tipo de mapa que você seleciona depende de quais informações você deseja comunicar em seu relatório. Você pode adicionar um mapa que exibe apenas locais, ou um mapa de bolha que varia o tamanho da bolha com base no número de famílias para uma área, ou um mapa de marcador que varia o estilo do marcador com base no produto mais lucrativo para cada loja, ou um mapa de linha que exibe as rotas entre as lojas.

Um mapa contém um título, uma janela de visualização que especifica o ponto central e a escala, um plano de fundo opcional do mapa do Bing para a janela de visualização, uma ou mais camadas que exibem dados espaciais e uma variedade de legendas que ajudam os usuários a interpretar as visualizações de dados. A ilustração a seguir mostra as partes básicas de um mapa.

Você pode salvar mapas separados de um relatório como partes do relatório. Leia mais sobre as partes do relatório.


3 respostas 3

Você pode usar .STIntersection com .STAsText () para testar polígonos sobrepostos. (Eu realmente odeio a terminologia que a Microsoft usou (ou quem quer que tenha definido os termos padrão). "Tocar", na minha opinião, deveria ser um teste para ver se duas formas geométricas / geográficas se sobrepõem, não apenas compartilham uma borda.)

Se @RadiusGeom for uma geometria que representa um raio de um ponto, o seguinte retornará uma lista de quaisquer dois polígonos onde uma interseção (uma geometria que representa a área onde duas geometrias se sobrepõem) não está vazia.

Se o seu campo de geometria for indexado espacialmente, isso será executado muito rapidamente. Eu executei isso em 66.000 registros de tomografia computadorizada dos EUA em cerca de 3 segundos. Pode haver uma maneira melhor, mas como ninguém mais tinha uma resposta, esta foi minha tentativa de uma resposta para você. Espero que ajude!

Calcule e armazene o retângulo delimitador de cada polígono em um conjunto de novos campos dentro da linha associada a esse polígono. (Presumo que você tenha um, se não, crie um.) Quando seu aplicativo dotnet tem um polígono e está procurando por polígonos sobrepostos, ele pode buscar no banco de dados apenas os polígonos cujos retângulos delimitadores se sobrepõem, usando uma instrução SQL SELECT relativamente simples. Esses polígonos devem ser relativamente poucos, então isso será eficiente. Em seguida, seu aplicativo dotnet pode realizar os cálculos mais precisos de sobreposição de polígonos para determinar quais deles realmente se sobrepõem.

Ok, eu tenho outra ideia, então estou postando como uma resposta diferente. Acho que minha resposta anterior com os polígonos delimitadores provavelmente tem algum mérito por si só, mesmo que fosse para reduzir o número de polígonos buscados no banco de dados em uma pequena porcentagem, mas este provavelmente é melhor.

MSSQL suporta integração com o CLR desde a versão 2005. Isso significa que você pode definir seu próprio tipo de dados em um assembly, registrar o assembly com MSSQL e, a partir desse momento, o MSSQL estará aceitando seu tipo de dados definido pelo usuário como um tipo válido para uma coluna, e ele irá invocar seu assembly para realizar operações com seu tipo de dados definido pelo usuário.

Um artigo de exemplo para esta técnica no CodeProject: Criando Tipos de Dados Definidos pelo Usuário no SQL Server 2005

Nunca usei esse mecanismo, então não sei detalhes sobre ele, mas presumo que você deva ser capaz de definir uma nova operação em seu tipo de dados, ou talvez sobrecarregar alguma operação existente como "menor que", para que você pode verificar se um polígono se cruza com outro. É provável que isso acelere muito as coisas.


Tipos de dados SQL espaciais

Existem dois tipos principais de dados suportados no servidor SQL: tipo de dados de geometria e tipo de dados de geografia.

    Tipo de dados espaciais de geometria

É substancialmente uma representação bidimensional de um objeto e também útil no caso de representados como pontos em um plano ou dados de terra plana. Um bom exemplo disso é (10, 2) onde o primeiro número '10' identifica a posição desse ponto no eixo horizontal (x) e o número '2' representa a posição do ponto no eixo vertical (y). Um caso de uso comum do tipo Geometria é para um objeto tridimensional, como um edifício

Eles são representados como graus latitudinais e longitudinais, como em um sistema de coordenadas de terra redonda. O caso de uso comum do tipo Geografia é armazenar os dados de GPS de um aplicativo. No SQL Server, os dois tipos de dados SQL foram implementados no CLR (Common Language Runtime) .NET


O ponto decimal (.) É sempre usado como delimitador decimal, independentemente de sua localidade ou configurações regionais. A vírgula não pode ser usada como delimitador decimal ou de milhares em uma expressão.

Você pode consultar números usando igual (=), diferente (& lt & gt), maior que (& gt), menor que (& lt), maior ou igual a (& gt =), menor ou igual a (& lt =) e ENTRE operadores, por exemplo:

As funções numéricas podem ser usadas para formatar números. Por exemplo, a função ROUND arredonda um número para um determinado número de decimais em um geodatabase de arquivo:

Consulte a documentação do seu DBMS para obter uma lista das funções numéricas suportadas.


Relações espaciais

A principal função de um GIS é determinar as relações espaciais entre os recursos: eles se sobrepõem? Um está contido pelo outro? Um se cruza com o outro?

As geometrias podem ser espacialmente relacionadas de diferentes maneiras. A seguir estão exemplos de como uma geometria pode ser espacialmente relacionada a outra:

  • A geometria A passa pela geometria B.
  • A geometria A está completamente contida na geometria B.
  • A geometria A contém completamente a geometria B.
  • As geometrias não se cruzam ou se tocam.
  • As geometrias são completamente coincidentes.
  • As geometrias se sobrepõem.
  • As geometrias se tocam em um ponto.

Para determinar se esses relacionamentos existem ou não, execute funções de relacionamento espacial. Essas funções comparam as seguintes propriedades das geometrias que você especifica em sua consulta:

  • Os exteriores (E) das geometrias, que é todo o espaço não ocupado por uma geometria
  • O interior (I) das geometrias, que é o espaço ocupado por uma geometria
  • O limite (B) das geometrias, que é a interface entre o interior e o exterior de uma geometria

Ao construir uma consulta de relacionamento espacial, especifique o tipo de relacionamento espacial que está procurando e as geometrias que deseja comparar. As consultas retornam como verdadeiras ou falsas, as geometrias participam umas das outras no relacionamento espacial especificado ou não. Na maioria dos casos, você usaria uma consulta de relacionamento espacial para filtrar um conjunto de resultados, colocando-o na cláusula WHERE.

Por exemplo, se você tiver uma tabela que armazena os locais de locais de desenvolvimento propostos e outra tabela que armazena a localização de locais arqueologicamente significativos, você pode querer ter certeza de que os recursos na tabela de locais de desenvolvimento não cruzam os locais arqueológicos. Você pode emitir uma consulta para garantir que nenhum dos sites de desenvolvimento faça intersecção com sites de arqueologia e, se houver, retornar a ID desses desenvolvimentos propostos. Neste exemplo, a função ST_Disjoint é usada.

Esta consulta retorna o nome do empreendimento e o ID do sítio arqueológico que não são separados - em outras palavras, os sítios que se cruzam. Ele retorna um projeto de desenvolvimento, Bow Wow Chow, que cruza o sítio arqueológico A1009.

Para obter informações sobre funções ST_Geometry que testam relacionamentos espaciais no Oracle ou PostgreSQL, consulte Funções de relacionamento espacial para ST_Geometry. Para obter informações sobre as funções de relacionamento espacial usadas com os tipos espaciais IBM DB2, IBM Informix, Oracle Spatial, PostGIS ou Microsoft SQL Server, consulte a documentação desses sistemas de gerenciamento de banco de dados.


Insira dados ST_Geometry usando SQL

Você pode usar SQL para inserir dados espaciais em um banco de dados ou tabela de banco de dados geográfico que possui uma coluna ST_Geometry. Use as funções do construtor ST_Geometry para inserir tipos de geometria específicos. Você também pode especificar que a saída de certas funções de operação espacial seja enviada para uma tabela existente.

Ao inserir uma geometria em uma tabela usando SQL, esteja ciente do seguinte:

  • Você deve especificar um ID de referência espacial (SRID) válido.
  • Para continuar usando a tabela com ArcGIS, o campo que está sendo usado como ObjectID não pode ser nulo.

IDs de referência espacial

O SRID que você especifica ao inserir uma geometria em uma tabela no Oracle que usa o tipo espacial ST_Geometry deve estar na tabela ST_SPATIAL_REFERENCES e ter um registro correspondente na tabela SDE.SPATIAL_REFERENCES. O SRID que você especifica ao inserir uma geometria em uma tabela no PostgreSQL que usa o tipo espacial ST_Geometry deve estar na tabela public.sde_spatial_references. A partir do ArcGIS 10.1, essas tabelas são pré-preenchidas com referências espaciais e SRIDs.

O SRID que você especifica ao inserir uma geometria em uma tabela no SQLite que usa o tipo espacial ST_Geometry (um geometryblob) deve estar na tabela st_spatial_reference_systems.

Se você precisar usar uma referência espacial personalizada que não está presente na tabela, a maneira mais fácil de fazer isso é usar o ArcGIS for Desktop para carregar ou criar uma classe de recurso que tenha os valores de referência espacial que você deseja. Certifique-se de que a classe de recurso que você criou está usando o armazenamento ST_Geometry. Isso cria um registro nas tabelas SDE.SPATIAL_REFERENCES e ST_SPATIAL_REFERENCES no Oracle, um registro na tabela public.sde_spatial_references no PostgreSQL ou um registro na st_aux_spatial_reference_systems_table no SQLite.

Em bancos de dados geográficos, você pode consultar a tabela LAYERS (Oracle) ou sde_layers (PostgreSQL) para descobrir o SRID atribuído à tabela espacial. Você poderia então usar esse SRID ao criar tabelas espaciais e inserir dados usando SQL.

Como alternativa, você pode adicionar uma referência espacial à tabela ST_SPATIAL_REFERENCES ou sde_spatial_references usando SQL. Consulte Criando referências espaciais usando SQL para obter mais informações.

Para obter uma explicação sobre SRIDs e sistemas de referência espacial, consulte O que é um SRID? e referências espaciais.

ObjectIDs

Para que o ArcGIS consulte os dados, é necessário que a tabela contenha um campo de identificador exclusivo.

As classes de feições criadas com ArcGIS sempre possuem um campo ObjectID que é usado como o campo identificador. Ao inserir registros na classe de feição usando ArcGIS, um valor único é sempre inserido no campo ObjectID. O campo ObjectID em uma tabela de geodatabase é mantido pelo ArcGIS. O campo ObjectID em uma tabela de banco de dados criada a partir do ArcGIS é mantido pelo DBMS.

Ao inserir registros em uma tabela de banco de dados geográfico usando SQL, você deve usar a função Next_RowID para obter e inserir um valor ObjectID válido. Quando você usa SQL para inserir registros em uma tabela de banco de dados que foi criada no ArcGIS, o DBMS irá preencher o campo ObjectID com um valor.

As tabelas de banco de dados que você cria fora do ArcGIS devem ter um campo (ou conjunto de campos) que o ArcGIS pode usar como um ObjectID. Se você usar o tipo de dados de incremento automático nativo do seu banco de dados para o campo ID em sua tabela, este campo será preenchido pelo DBMS quando você inserir um registro usando SQL. Se você estiver mantendo manualmente os valores em seu campo de identificador exclusivo, certifique-se de fornecer um valor exclusivo para o ID ao editar a tabela do SQL.

Você não pode publicar dados de tabelas que possuem um campo de identificador exclusivo mantido pelo usuário.

Consulte O que é um ObjectID? Para maiores informações.


Geometria vs Geografia

por curtvprice por JoshuaBixby

Com relação ao Hive / SparkSQL e à geometria do Esri, ou seja, a última parte da sua pergunta, postarei uma resposta separada depois de reunir um pouco mais as minhas ideias.

Com relação à Geometria e Geografia do MS SQL, ambos os resultados estão corretos de acordo com o que você perguntou. Os exemplos de geometria e geografia não são o mesmo exemplo, portanto, os resultados não serão necessariamente os mesmos.

  • O tipo de geometria representa dados em um sistema de coordenadas euclidianas (planas).

  • O tipo de geografia representa dados em um sistema de coordenadas de terra redonda.

Os dois tipos de dados espaciais geralmente se comportam de maneira bastante semelhante, mas existem algumas diferenças importantes em como os dados são armazenados e manipulados.

Como as bordas de conexão são definidas

Os dados de definição para os tipos LineString e Polygon são apenas vértices. A aresta de conexão entre dois vértices em um tipo de geometria é uma linha reta. No entanto, a borda de conexão entre dois vértices em um tipo de geografia é um grande arco elíptico curto entre os dois vértices. Uma grande elipse é a intersecção do elipsóide com um plano através de seu centro e um grande arco elíptico é um segmento de arco na grande elipse.

Como os segmentos de arco circular são definidos

Os segmentos de arco circular para tipos de geometria são definidos no plano de coordenadas cartesianas XY (os valores Z são ignorados). Os segmentos de arco circular para tipos de geografia são definidos por segmentos de curva em uma esfera de referência. Qualquer paralelo na esfera de referência pode ser definido por dois arcos circulares complementares, onde os pontos de ambos os arcos têm um ângulo de latitude constante.

Medições em tipos de dados espaciais

No sistema plano, ou de terra plana, as medidas de distâncias e áreas são fornecidas na mesma unidade de medida que as coordenadas. Usando o tipo de dados de geometria, a distância entre (2, 2) e (5, 6) é de 5 unidades, independentemente das unidades usadas.

No sistema elipsoidal ou de terra redonda, as coordenadas são fornecidas em graus de latitude e longitude. No entanto, comprimentos e áreas são geralmente medidos em metros e metros quadrados, embora a medição possa depender do identificador de referência espacial (SRID) da instância de geografia. A unidade de medida mais comum para o tipo de dados geográficos é metros.

Para o (s) exemplo (s) fornecido (s), os valores das coordenadas geográficas estão sendo usados ​​como valores das coordenadas geométricas sem transformações ou projeções ocorrendo. Se você olhar para a área de apenas um dos polígonos, verá que os polígonos são substancialmente diferentes:

Para os tipos de geometria do SQL Server, o SRID não significa muito para o próprio DBMS. Os SRIDs dos objetos de geometria devem corresponder, o que garante a mesma projeção e unidades de medida, mas então a matemática plana simples é aplicada. Passar valores de coordenadas geográficas e um sistema de coordenadas geográficas para o construtor de geometria não aplica quaisquer transformações ou projeções de qualquer tipo.

Se você quiser uma comparação de maçãs com maçãs, precisará projetar as coordenadas geográficas antes de construir o exemplo de geometria.


Visão geral do método

Retorna uma tupla de ângulo e distância para outro ponto usando um tipo de medição.

Constrói o limite da geometria.

Constrói um polígono a uma distância especificada da geometria.

Constrói a interseção da geometria e a extensão especificada.

Indica se a geometria base contém a geometria de comparação.

contém é o oposto de dentro.

Apenas relacionamentos verdadeiros são mostrados nesta ilustração.

Constrói a geometria que é o polígono delimitador mínimo de forma que todos os ângulos externos sejam convexos.

Indica se as duas geometrias se cruzam em uma geometria de um tipo de forma inferior.

Duas polilinhas se cruzam se compartilharem apenas pontos em comum, pelo menos um dos quais não é um ponto final. Uma polilinha e um polígono se cruzam se eles compartilham uma polilinha ou um ponto (para linha vertical) em comum no interior do polígono que não é equivalente a toda a polilinha.

Apenas relacionamentos verdadeiros são mostrados nesta ilustração.

Divide esta geometria em uma parte à esquerda da polilinha de corte e uma parte à direita dela.

Quando uma polilinha ou polígono é cortado, ele é dividido onde cruza a polilinha do cortador. Cada peça é classificada como esquerda ou direita do cortador. Esta classificação é baseada na orientação da linha de corte. As partes da polilinha de destino que não interceptam a polilinha de corte são retornadas como parte da direita do resultado para essa polilinha de entrada. Se uma geometria não for cortada, a geometria esquerda ficará vazia (nenhuma).

Cria uma nova geometria com vértices adicionados.

Constrói a geometria que é composta apenas pela região exclusiva da geometria base, mas não faz parte da outra geometria. A ilustração a seguir mostra os resultados quando o polígono vermelho é a geometria de origem.

Indica se as geometrias de base e de comparação não compartilham pontos em comum.

Duas geometrias se cruzam se disjunta retornar False.

Apenas relacionamentos verdadeiros são mostrados nesta ilustração.

Retorna a distância mínima entre duas geometrias. Se as geometrias se cruzam, a distância mínima é 0.

Ambas as geometrias devem ter a mesma projeção.

Indica se as geometrias de base e de comparação são do mesmo tipo de forma e definem o mesmo conjunto de pontos no plano. Esta é uma comparação 2D, apenas os valores M e Z são ignorados.

Apenas relacionamentos verdadeiros são mostrados nesta ilustração.

Cria uma nova geometria simplificada usando uma tolerância máxima de deslocamento especificada.

Retorna a área do recurso usando um tipo de medida.

Retorna o comprimento do recurso usando um tipo de medida.

Retorna uma matriz de objetos de ponto para uma parte específica da geometria ou uma matriz contendo várias matrizes, uma para cada parte.

Constrói uma geometria que é a interseção geométrica das duas geometrias de entrada. Diferentes valores de dimensão podem ser usados ​​para criar diferentes tipos de forma.

A interseção de duas geometrias do mesmo tipo de forma é uma geometria que contém apenas as regiões de sobreposição entre as geometrias originais.

Para resultados mais rápidos, teste se as duas geometrias são disjuntas antes de chamar a intersecção.

Retorna uma medida do ponto inicial desta linha até o ponto_in.

Indica se a interseção das duas geometrias tem o mesmo tipo de forma que uma das geometrias de entrada e não é equivalente a nenhuma das geometrias de entrada.

Apenas relacionamentos verdadeiros são mostrados nesta ilustração.

Retorna um ponto em um determinado ângulo e distância em graus e metros usando o tipo de medição especificado.

Retorna um ponto em uma linha a uma distância especificada do início da linha.

Projeta uma geometria e, opcionalmente, aplica uma geotransformação.

Para projetar, a geometria precisa ter uma referência espacial e não ter um UnknownCoordinateSystem. O novo sistema de referência espacial passado para o método define o sistema de coordenadas de saída. Se qualquer uma das referências espaciais for desconhecida, as coordenadas não serão alteradas. Os valores Z- e medidos não são alterados pelo método ProjectAs.

Encontra o ponto na polilinha mais próximo do in_point e a distância entre esses pontos. Também retorna informações sobre o lado da linha em que o ponto_in está, bem como a distância ao longo da linha onde ocorre o ponto mais próximo.

Retorna uma polilinha entre as medidas inicial e final. Semelhante a Polyline.positionAlongLine, mas retornará um segmento de polilinha entre dois pontos na polilinha em vez de um único ponto.

Retorna um novo ponto com base no ponto_in encaixado nesta geometria.

Constrói a geometria que é a união de duas geometrias menos a interseção dessas geometrias.

As duas geometrias de entrada devem ser do mesmo tipo de forma.

Indica se os limites das geometrias se cruzam.

Duas geometrias se tocam quando a interseção das geometrias não está vazia, mas a interseção de seus interiores está vazia. Por exemplo, um ponto toca uma polilinha apenas se o ponto coincidir com uma das extremidades da polilinha.

Apenas relacionamentos verdadeiros são mostrados nesta ilustração.

Constrói a geometria que é a união teórica dos conjuntos das geometrias de entrada.

As duas geometrias sendo unidas devem ter o mesmo tipo de forma.

Indica se a geometria base está dentro da geometria de comparação.

dentro é o operador oposto de contém.

Apenas relacionamentos verdadeiros são mostrados nesta ilustração.


Quais são as diferenças sobre sinônimos entre PostgreSQL e SQL server? Compare os sinônimos em PostgreSQL e MSSQL

O SQL Server oferece suporte a sinônimos. Sinônimos fornecem uma camada de abstração que protege um aplicativo cliente de alterações feitas em objetos base. Um sinônimo pertence a um esquema e, como outros objetos em um esquema, seu nome deve ser exclusivo. A vinculação é por nome apenas se um objeto base for modificado, eliminado ou substituído, a referência ausente só será encontrada em tempo de execução. PostgreSQL não suporta sinônimos.


Assista o vídeo: ArcGIS - Update - Remove overlapping or intersection of two features (Outubro 2021).