Mais

Converter dados SqlGeometry de SQL diretamente para arquivos Tiles / PNG

Converter dados SqlGeometry de SQL diretamente para arquivos Tiles / PNG


Gostaria de saber um método básico para 'exportar' dados SqlGeometry do SQL Server 2008 para um Tile Server / gerador de arquivo PNG. Já tenho um aplicativo de mapa do Silverlight que usa uma camada de bloco personalizado para visualizar blocos. Eu gostaria de adicionar outra (esses blocos gerados) camada transparente de arquivos PNG no topo da minha camada base.

Os 'resultados espaciais' na 'imagem' do SQL Server Management Studio precisam ser convertidos em blocos de 256x256 compostos de arquivos PNG, com um quadkey para saber onde colocá-lo no mapa.

Existe uma maneira básica 'rápida e fácil' de fazer isso? E, conforme os dados são atualizados no SQL, os blocos precisam ser gerados novamente.

Muito obrigado.

Cheerio


A maneira mais fácil de fazer isso seria usar o Geoserver / GeoWebCache com a extensão do MS SQL Server. Infelizmente, você não obterá arquivos PNG com quadkey como aspecto, mas obterá um serviço que pode servir blocos como um padrão WMS-C / TMS que não deve ser tão difícil de implementar em seu aplicativo. Também tem a possibilidade de renderizar novamente as peças em particular conforme solicitado. Além disso, se você estiver fazendo uma sobreposição com outra camada, elas devem estar no mesmo sistema de coordenadas e projeção, não é apenas uma questão de localização dos ladrilhos.

Como ponto de partida, vá aqui:

Introdução a um Geostack de código aberto

GeoServer

GeoWebCache

Você disse que está usando o Silverlight para seu aplicativo, dê uma olhada em um projeto, o BruTile, que também usa o Silverlight para mapeamento, talvez ele possa ajudá-lo.


Tudo o que você nunca quis saber sobre gráficos geográficos

Antes do início da sétima série, minha família se mudou e eu comecei uma nova escola que tinha como módulo obrigatório, cartografia. Durante algumas semanas, desenhamos cuidadosamente mapas de estados, continentes e, eventualmente, o mundo inteiro. Minha mochila ficou cheia de vários estênceis, uma bússola, lápis de cor, canetas de vários pesos e até mesmo papel vegetal. Foi uma das partes mais frustrantes da minha escolaridade e me lembro de pensar & ldquoPor que eu precisaria disso? & Rdquo

Muito rápido e agora a possibilidade de visualizar dados em mapas para nossos computadores e dispositivos transformou todos os aspirantes em cientistas de dados em cartógrafos.

Mas existe uma curva de aprendizado íngreme. Esta postagem resume os conceitos-chave que eu tive que reaprender antes de realmente entender como construir visualizações de mapas regularmente. Para mim, o entendimento principal veio quando eu dominei cinco conceitos:

  1. Fontes de dados: Onde obtemos dados geográficos e em que formato?
  2. Geometria: Especificamente como representamos formas geométricas em uma fonte de dados para mapeamento?
  3. Projeção: Como você pega a bola de basquete esmagada de um planeta e a representa na tela do computador?
  4. Camadas e conjuntos de blocos: O que olhamos quando vemos um mapa?
  5. Calcule algo: Como fazemos uma análise que funcione e forneça uma visão?

Para esta postagem, vamos codificar em Python com visualizações construídas principalmente em Folium. Os dados usados ​​são provenientes do Greensboro, NC Fire Incident Database da Greensboro Open Data


Para tornar o mapa perfeito e garantir que as imagens aéreas de diferentes fontes se alinhem corretamente, temos que usar uma única projeção para o mundo inteiro. Escolhemos usar o Projeção mercator, que se parece com isto:

Embora a projeção de Mercator distorça significativamente a escala e a área (particularmente perto dos pólos), ela tem duas propriedades importantes que superam a distorção da escala:

É um conforme projeção, o que significa que ele preserva a forma de objetos relativamente pequenos. Isso é especialmente importante ao mostrar imagens aéreas, porque queremos evitar distorcer a forma dos edifícios. Os edifícios quadrados devem parecer quadrados, não retangulares.

É um cilíndrico projeção, o que significa que o norte e o sul estão sempre retos para cima e para baixo, e o oeste e o leste são sempre retos para a esquerda e para a direita.

Uma vez que a projeção de Mercator vai ao infinito nos pólos, ela não mostra o mundo inteiro. Usando uma proporção quadrada para o mapa, a latitude máxima mostrada é de aproximadamente 85,05 graus.

Para simplificar os cálculos, usamos a forma esférica desta projeção, não a forma elipsoidal. Uma vez que a projeção é usada apenas para exibição de mapa, e não para exibição de coordenadas numéricas, não precisamos da precisão extra de uma projeção elipsoidal. A projeção esférica causa distorção de escala de aproximadamente 0,33% na direção Y, que não é visualmente perceptível.

Resolução do solo e escala do mapa

Além da projeção, a resolução do solo ou escala do mapa deve ser especificada para renderizar um mapa. No nível de detalhe mais baixo (Nível 1), o mapa tem 512 x 512 pixels. Em cada nível sucessivo de detalhe, a largura e a altura do mapa aumentam por um fator de 2: o nível 2 é 1024 x 1024 pixels, o nível 3 é 2048 x 2048 pixels, o nível 4 é 4096 x 4096 pixels e assim por diante. Em geral, a largura e a altura do mapa (em pixels) podem ser calculadas como:

largura do mapa = altura do mapa = 256 * pixels de 2 níveis

O resolução de solo indica a distância no solo que é representada por um único pixel no mapa. Por exemplo, em uma resolução do solo de 10 metros / pixel, cada pixel representa uma distância do solo de 10 metros. A resolução do solo varia dependendo do nível de detalhe e da latitude em que é medida. Usando um raio terrestre de 6378137 metros, a resolução do solo (em metros por pixel) pode ser calculada como:

resolução do solo = cos (latitude * pi / 180) * circunferência da terra / largura do mapa

= (cos (latitude * pi / 180) * 2 * pi * 6378137 metros) / (256 * 2 pixels de nível)

O escala do mapa indica a relação entre a distância do mapa e a distância do solo, quando medida nas mesmas unidades. Por exemplo, em uma escala de mapa de 1: 100.000, cada polegada no mapa representa uma distância do solo de 100.000 polegadas. Como a resolução do solo, a escala do mapa varia com o nível de detalhe e a latitude da medição. Ele pode ser calculado a partir da resolução do solo da seguinte forma, dada a resolução da tela em pontos por polegada, normalmente 96 dpi:

escala do mapa = 1: resolução do solo * dpi da tela / 0,0254 metros / polegada

= 1: (cos (latitude * pi / 180) * 2 * pi * 6378137 * dpi da tela) / (256 * nível 2 * 0,0254)

Esta tabela mostra cada um desses valores em cada nível de detalhe, conforme medido no Equador. (Observe que a resolução do solo e a escala do mapa também variam com a latitude, conforme mostrado nas equações acima, mas não mostrado na tabela abaixo.)

Nível de detalhe Largura e altura do mapa (pixels) Resolução do solo (metros / pixel) Escala do mapa
(em 96 dpi)
1 512 78,271.5170 1 : 295,829,355.45
2 1,024 39,135.7585 1 : 147,914,677.73
3 2,048 19,567.8792 1 : 73,957,338.86
4 4,096 9,783.9396 1 : 36,978,669.43
5 8,192 4,891.9698 1 : 18,489,334.72
6 16,384 2,445.9849 1 : 9,244,667.36
7 32,768 1,222.9925 1 : 4,622,333.68
8 65,536 611.4962 1 : 2,311,166.84
9 131,072 305.7481 1 : 1,155,583.42
10 262,144 152.8741 1 : 577,791.71
11 524,288 76.4370 1 : 288,895.85
12 1,048,576 38.2185 1 : 144,447.93
13 2,097,152 19.1093 1 : 72,223.96
14 4,194,304 9.5546 1 : 36,111.98
15 8,388,608 4.7773 1 : 18,055.99
16 16,777,216 2.3887 1 : 9,028.00
17 33,554,432 1.1943 1 : 4,514.00
18 67,108,864 0.5972 1 : 2,257.00
19 134,217,728 0.2986 1 : 1,128.50
20 268,435,456 0.1493 1 : 564.25
21 536,870,912 0.0746 1 : 282.12
22 1,073,741,824 0.0373 1 : 141.06
23 2,147,483,648 0.0187 1 : 70.53

Coordenadas de pixel

Tendo escolhido a projeção e a escala para usar em cada nível de detalhe, podemos converter coordenadas geográficas em coordenadas de pixel. Como a largura e a altura do mapa são diferentes em cada nível, o mesmo ocorre com as coordenadas dos pixels. O pixel no canto superior esquerdo do mapa sempre tem coordenadas de pixel (0, 0). O pixel no canto inferior direito do mapa tem coordenadas de pixel (largura-1, altura-1), ou referindo-se às equações na seção anterior, (256 * 2 nível –1, 256 * 2 nível –1). Por exemplo, no nível 3, as coordenadas do pixel variam de (0, 0) a (2047, 2047), assim:

Dadas a latitude e longitude em graus e o nível de detalhe, as coordenadas XY do pixel podem ser calculadas da seguinte forma:

sinLatitude = sin (latitude * pi / 180)

pixelX = ((longitude + 180) / 360) * 256 * 2 nível

pixelY = (0,5 - log ((1 + sinLatitude) / (1 - sinLatitude)) / (4 * pi)) * 256 * 2 nível

A latitude e a longitude são assumidas no datum WGS 84. Mesmo que o Bing Maps use uma projeção esférica, é importante converter todas as coordenadas geográficas em um datum comum, e WGS 84 foi escolhido para ser esse datum. Presume-se que a longitude varie de -180 a +180 graus e a latitude deve ser cortada para variar de -85,05112878 a 85,05112878. Isso evita uma singularidade nos pólos e faz com que o mapa projetado fique quadrado.

Coordenadas de bloco e Quadkeys

Para otimizar o desempenho da recuperação e exibição do mapa, o mapa renderizado é cortado em blocos de 256 x 256 pixels cada. Como o número de pixels difere em cada nível de detalhe, o mesmo ocorre com o número de blocos:

largura do mapa = altura do mapa = blocos de 2 níveis

Cada bloco recebe coordenadas XY variando de (0, 0) no canto superior esquerdo a (2 níveis –1, 2 níveis –1) no canto inferior direito. Por exemplo, no nível 3, as coordenadas dos blocos variam de (0, 0) a (7, 7) da seguinte forma:

Dado um par de coordenadas XY de pixel, você pode determinar facilmente as coordenadas XY do bloco que contém esse pixel:

Para otimizar a indexação e o armazenamento de blocos, as coordenadas XY dos blocos bidimensionais são combinadas em strings unidimensionais chamadas chaves quadtree ou “quadkeys” para abreviar. Cada quadkey identifica exclusivamente um único bloco em um determinado nível de detalhe e pode ser usado como uma chave em índices de árvore B de banco de dados comuns. Para converter coordenadas de bloco em uma chave quádrupla, os bits das coordenadas Y e X são intercalados e o resultado é interpretado como um número de base 4 (com zeros à esquerda mantidos) e convertido em uma string. Por exemplo, dadas as coordenadas XY do bloco de (3, 5) no nível 3, o quadkey é determinado da seguinte forma:

quadkey = 100111 2 = 213 4 = “213”

Quadkeys têm várias propriedades interessantes. Primeiro, o comprimento de uma quadkey (o número de dígitos) é igual ao nível de detalhe do ladrilho correspondente. Segundo, o quadkey de qualquer ladrilho começa com o quadkey de seu ladrilho pai (o ladrilho que o contém no nível anterior). Conforme mostrado no exemplo abaixo, o bloco 2 é o pai dos blocos 20 a 23, e o bloco 13 é o pai dos blocos 130 a 133:

Finalmente, quadkeys fornecem uma chave de índice unidimensional que geralmente preserva a proximidade de blocos no espaço XY. Em outras palavras, dois blocos com coordenadas XY próximas geralmente têm quatro teclas que estão relativamente próximas. Isso é importante para otimizar o desempenho do banco de dados, porque os tiles vizinhos são geralmente solicitados em grupos, e é desejável manter esses tiles nos mesmos blocos de disco, a fim de minimizar o número de leituras de disco.

Código de amostra

O exemplo de código C # a seguir ilustra como implementar as funções descritas neste documento. Essas funções podem ser facilmente traduzidas para outras linguagens de programação, conforme necessário.


Tipos de dados espaciais

Os dados espaciais descrevem a localização física e a forma de objetos geométricos. Esses objetos podem ser localizações pontuais ou objetos complexos, como países, estradas ou lagos. Os tipos de dados espaciais do SQL Server & # 8217s, que são baseados em coordenadas de latitude e longitude, permitem armazenar esses objetos e disponibilizá-los para aplicativos de chamada.

O SQL Server oferece suporte a dois tipos de dados espaciais:

  • Geometria : Armazena dados com base em um sistema de coordenadas planas (euclidiano). O tipo de dados geralmente é usado para armazenar as coordenadas X e Y que representam linhas, pontos e polígonos em espaços bidimensionais.
  • Geografia: Armazena dados com base em um sistema de coordenadas de terra redonda. O tipo de dados é usado para armazenar as coordenadas de latitude e longitude que representam linhas, polígonos e pontos.

Cada um dos tipos de dados espaciais tem seu próprio uso. Por exemplo, o Geografia tipo é frequentemente usado para armazenar dados de GPS de um aplicativo, enquanto o Geometria tipo geralmente é usado para mapear um objeto tridimensional, como um edifício.

Juntos, os dois tipos de dados espaciais suportam 16 tipos de objetos de dados. Dos 16, 11 são instanciados (podem ser representados) em um banco de dados. Eles derivam certas propriedades de seu tipo de dados pai e são essas propriedades que os distinguem como objetos, como pontos ou cadeias de linhas.

Dez dos objetos de dados instanciados estão disponíveis para ambos os Geometria e Geografia tipos de dados. Os objetos incluem Point, MultiPoint, LineString, CircularString, MultiLineString, CompoundCurve, Polygon, CurvePolygon, MultiPolygon e GeometryCollection. O décimo primeiro tipo de objeto, FullGlobe, é instanciado apenas para o Geografia tipo de dados.

Os tipos de objetos suportados pelos tipos de dados espaciais podem ser divididos em dois grupos:

  • Geometrias simples: Geometrias únicas são tipos que podem ser armazenados no banco de dados apenas de uma maneira.
  • Coleção de geometria: Uma coleção de geometria, como o nome indica, é uma coleção de tipos de objetos de dados.

Os tipos de objetos associados a um tipo de dados espaciais formam um relacionamento entre si. Por exemplo, o diagrama a seguir ilustra como os tipos de objeto do Geometria os tipos de dados estão relacionados:

Embora a figura seja específica para o Geometria tipo de dados, também se aplica ao Geografia tipo de dados. Para cada tipo de dados, existem seis geometrias únicas e quatro geometrias de coleção. As geometrias únicas são as seguintes:

  • Apontar
  • LineString
  • CircularString
  • CompoundCurve
  • Polígono
  • CurvePolygon

Aqui estão as geometrias da coleção:

Como mencionado acima, o Geografia tipo de dados também suporta o FullGlobe objeto de dados. Agora, vamos examinar cada tipo de objeto em detalhes.


Operações geoespaciais usando bibliotecas geoespaciais para Apache Spark

Nos últimos anos, várias bibliotecas foram desenvolvidas para estender os recursos do Apache Spark para análise geoespacial. Essas estruturas suportam o impacto de registrar tipos definidos pelo usuário (UDT) e funções (UDF) comumente aplicados de uma maneira consistente, eliminando a carga de outra forma colocada sobre os usuários e equipes para escrever lógica espacial ad-hoc. Observe que nesta postagem do blog, usamos várias estruturas espaciais diferentes escolhidas para destacar vários recursos. Entendemos que existem outras estruturas além daquelas destacadas que você também pode querer usar com o Databricks para processar suas cargas de trabalho espaciais.

Anteriormente, carregamos nossos dados de base em um DataFrame. Agora precisamos transformar os atributos de latitude / longitude em geometrias de ponto. Para fazer isso, usaremos UDFs para realizar operações em DataFrames de maneira distribuída. Consulte os blocos de notas fornecidos no final do blog para obter detalhes sobre como adicionar essas estruturas a um cluster e as chamadas de inicialização para registrar UDFs e UDTs. Para começar, adicionamos GeoMesa ao nosso cluster, uma estrutura especialmente adequada para lidar com dados vetoriais. Para ingestão, estamos alavancando principalmente sua integração de JTS com Spark SQL, que nos permite converter facilmente e usar classes de geometria JTS registradas. Estaremos usando a função st_makePoint que, dada uma latitude e longitude, cria um objeto de geometria Point. Como a função é uma UDF, podemos aplicá-la diretamente às colunas.

Uso de UDFs para realizar operações em DataFrames de maneira distribuída para transformar atributos de latitude / longitude de dados geoespaciais em geometrias de ponto.

Também podemos realizar junções espaciais distribuídas, neste caso usando st_contains UDF fornecido pela GeoMesa para produzir a junção resultante de todos os polígonos contra pontos de captação.

O uso do GeoMesa & # 8217s forneceu st_contains UDF, por exemplo, para produzir a junção resultante de todos os polígonos contra pontos de captação.


Funções geográficas em SQL padrão

As funções geográficas operam ou geram valores de GEOGRAPHY do BigQuery. A assinatura de qualquer função geográfica começa com ST_. O BigQuery oferece suporte às seguintes funções que podem ser usadas para analisar dados geográficos, determinar relações espaciais entre recursos geográficos e construir ou manipular GEOGRAFIA s.

Todas as funções geográficas do BigQuery retornam NULL se qualquer argumento de entrada for NULL.

Categorias

As funções geográficas são agrupadas nas seguintes categorias com base em seu comportamento:

Categoria Funções Descrição
Construtores ST_GEOGPOINT
ST_MAKELINE
ST_MAKEPOLYGON
ST_MAKEPOLYGONORIENTED
Funções que criam novos valores geográficos a partir de coordenadas ou geografias existentes.
Analisadores ST_GEOGFROMGEOJSON
ST_GEOGFROMTEXT
ST_GEOGFROMWKB
ST_GEOGPOINTFROMGEOHASH
Funções que criam geografias a partir de um formato externo, como WKT e GeoJSON.
Formatadores ST_ASBINÁRIO
ST_ASGEOJSON
ST_ASTEXT
ST_GEOHASH
Funções que exportam geografias para um formato externo, como WKT.
Transformações ST_BOUNDARY
ST_CENTROID
ST_CENTROID_AGG (agregado)
ST_CLOSESTPOINT
ST_CONVEXHULL
ST_DIFFERENCE
ST_DUMP
ST_INTERSECTION
ST_SIMPLIFY
ST_SNAPTOGRID
ST_UNION
ST_UNION_AGG (agregado)
Funções que geram uma nova geografia com base na entrada.
Acessores ST_DIMENSION
ST_DUMP
ST_ENDPOINT
ST_ISCOLLEÇÃO
ST_ISEMPTY
ST_NPOINTS
ST_NUMPOINTS
ST_POINTN
ST_STARTPOINT
ST_X
CHIQUEIRO
Funções que fornecem acesso às propriedades de uma geografia sem efeitos colaterais.
Predicados ST_CONTAINS
ST_COVEREDBY
ST_COVERS
ST_DISJOINT
ST_DWITHIN
ST_EQUALS
ST_INTERSECTS
ST_INTERSECTSBOX
ST_TOUCHES
ST_WITHIN
Funções que retornam TRUE ou FALSE para algum relacionamento espacial entre duas geografias ou alguma propriedade de uma geografia. Essas funções são comumente usadas em cláusulas de filtro.
Medidas ST_AREA
ST_DISTANCE
ST_LENGTH
ST_MAXDISTANCE
ST_PERIMETER
Funções que calculam medições de uma ou mais geografias.
Clustering ST_CLUSTERDBSCAN Funções que executam agrupamento em áreas geográficas.

ST_AREA

Descrição

Retorna a área em metros quadrados coberta pelos polígonos na entrada GEOGRAFIA.

Se geography_expression for um ponto ou uma linha, retorna zero. Se geography_expression for uma coleção, retorna a área dos polígonos na coleção, se a coleção não contiver polígonos, retorna zero.

O parâmetro opcional use_spheroid determina como essa função mede a distância. Se use_spheroid for FALSE, a função mede a distância na superfície de uma esfera perfeita.

O parâmetro use_spheroid atualmente suporta apenas o valor FALSE. O valor padrão de use_spheroid é FALSE.

Tipo de retorno

ST_ASBINÁRIO

Descrição

Retorna a representação WKB de uma GEOGRAFIA de entrada.

Consulte ST_GEOGFROMWKB para construir uma GEOGRAFIA de WKB.

Tipo de retorno

ST_ASGEOJSON

Descrição

Retorna a representação GeoJSON compatível com RFC 7946 da GEOGRAFIA de entrada.

Um BigQuery GEOGRAPHY tem bordas geodésicas esféricas, enquanto um objeto GeoJSON Geometry explicitamente tem bordas planas. Para converter entre esses dois tipos de arestas, o BigQuery adiciona pontos adicionais à linha, quando necessário, para que a sequência de arestas resultante permaneça dentro de 10 metros da borda original.

Consulte ST_GEOGFROMGEOJSON para construir uma GEOGRAFIA do GeoJSON.

Tipo de retorno

ST_ASTEXT

Descrição

Retorna a representação WKT de uma GEOGRAFIA de entrada.

Consulte ST_GEOGFROMTEXT para construir uma GEOGRAFIA de WKT.

Tipo de retorno

ST_BOUNDARY

Descrição

Retorna uma única GEOGRAFIA que contém a união dos limites de cada componente na GEOGRAFIA de entrada fornecida.

O limite de cada componente de uma GEOGRAFIA é definido da seguinte forma:

  • O limite de um ponto está vazio.
  • O limite de uma cadeia de linha consiste nos pontos finais da cadeia de linha.
  • O limite de um polígono consiste nas cadeias de linhas que formam a concha do polígono e cada um dos orifícios do polígono.

Tipo de retorno

ST_CENTROID

Descrição

Retorna o centróide da GEOGRAFIA de entrada como uma GEOGRAFIA de ponto único.

O centróide de uma GEOGRAFIA é a média ponderada dos centróides dos componentes dimensionais mais elevados da GEOGRAFIA. O centroide para componentes em cada dimensão é definido da seguinte forma:

  • O centróide dos pontos é a média aritmética das coordenadas de entrada.
  • O centróide das cadeias de linha é o centróide de todas as arestas ponderadas pelo comprimento. O centroide de cada aresta é o ponto médio geodésico da aresta.
  • O centróide de um polígono é seu centro de massa.

Se a entrada GEOGRAPHY estiver vazia, uma GEOGRAPHY vazia será retornada.

Restrições

No caso improvável de o centróide de uma GEOGRAFIA não poder ser definido por um único ponto na superfície da Terra, um ponto determinístico, mas arbitrário, é retornado. Isso só pode acontecer se o centróide estiver exatamente no centro da Terra, como o centróide de um par de pontos antípodas, e a probabilidade de isso acontecer é muito pequena.

Tipo de retorno

ST_CENTROID_AGG

Descrição

Calcula o centroide do conjunto de GEOGRAFIA s de entrada como uma GEOGRAFIA de ponto único.

O centróide sobre o conjunto de GEOGRAFIA de entrada s é a média ponderada do centróide de cada GEOGRAFIA individual. Apenas as GEOGRAFIAS com a maior dimensão presente na entrada contribuem para o centróide de todo o conjunto. Por exemplo, se a entrada contiver GEOGRAPHY s com linhas e GEOGRAPHY s apenas com pontos, ST_CENTROID_AGG retorna a média ponderada dos GEOGRAPHY s com linhas, uma vez que têm dimensão máxima. Neste exemplo, ST_CENTROID_AGG ignora GEOGRAPHY s com apenas pontos ao calcular o centróide agregado.

ST_CENTROID_AGG ignora valores de GEOGRAPHY de entrada NULL.

Consulte ST_CENTROID para a versão não agregada de ST_CENTROID_AGG e a definição de centróide para um valor GEOGRAPHY individual.

Tipo de retorno

As consultas a seguir calculam o centroide agregado sobre um conjunto de valores GEOGRAPHY. A entrada para a primeira consulta contém apenas pontos e, portanto, cada valor contribui para o centróide agregado. Observe também que ST_CENTROID_AGG é não equivalente a chamar ST_CENTROID no resultado de ST_UNION_AGG duplicatas são removidas pela união, ao contrário de ST_CENTROID_AGG. A entrada para a segunda consulta tem dimensões mistas e apenas os valores com a dimensão mais alta no conjunto, as linhas, afetam o centróide agregado.

ST_CLOSESTPOINT

Descrição

Retorna uma GEOGRAPHY contendo um ponto em geography_1 com a menor distância possível para geography_2. Isso implica que a distância entre o ponto retornado por ST_CLOSESTPOINT e geography_2 é menor ou igual à distância entre qualquer outro ponto em geography_1 e geography_2.

Se alguma das entradas GEOGRAPHY s estiver vazia, ST_CLOSESTPOINT retornará NULL.

O parâmetro opcional use_spheroid determina como essa função mede a distância. Se use_spheroid for FALSE, a função mede a distância na superfície de uma esfera perfeita.

O parâmetro use_spheroid atualmente suporta apenas o valor FALSE. O valor padrão de use_spheroid é FALSE.

Tipo de retorno

ST_CLUSTERDBSCAN

Executa o agrupamento DBSCAN em uma coluna de geografias. Retorna um número de cluster baseado em 0.

Parâmetros de entrada

  • geography_column: uma coluna de GEOGRAPHY s que é agrupada.
  • épsilon: o épsilon que especifica o raio, medido em metros, em torno de um valor central. Valor FLOAT64 não negativo.
  • minimum_geographies: especifica o número mínimo de geografias em um único cluster. Apenas a entrada densa forma um cluster, caso contrário, é classificado como ruído. Valor INT64 não negativo.

OVER: especifica uma janela. Consulte Funções analíticas. O uso da cláusula OVER com ST_CLUSTERDBSCAN é compatível com o seguinte:

Tipos de geografia e o algoritmo DBSCAN

O algoritmo DBSCAN identifica clusters de alta densidade de dados e marca outliers em áreas de ruído de baixa densidade. As geografias passadas por geography_column são classificadas de uma das três maneiras pelo algoritmo DBSCAN:

  • Valor central: uma geografia é um valor central se estiver a uma distância epsilon de minimum_geographies geographies, incluindo ela própria. O valor central inicia um novo cluster ou é adicionado ao mesmo cluster como um valor central dentro da distância epsilon. Os valores centrais são agrupados em um cluster junto com todos os outros valores centrais e de borda que estão dentro da distância épsilon.
  • Valor de borda: uma geografia é um valor de borda se estiver a uma distância épsilon de um valor central. Ele é adicionado ao mesmo cluster como um valor central dentro da distância epsilon. Um valor de borda pode estar dentro da distância épsilon de mais de um cluster. Nesse caso, ele pode ser atribuído arbitrariamente a qualquer cluster e a função produzirá o mesmo resultado em chamadas subsequentes.
  • Ruído: uma geografia é ruído se não for um valor central nem de fronteira. Os valores de ruído são atribuídos a um cluster NULL. Uma GEOGRAFIA vazia é sempre classificada como ruído.

Restrições

  • O argumento minimum_geographies é um INT64 não negativo e epsilon é um FLOAT64 não negativo.
  • Uma geografia vazia não pode se juntar a nenhum cluster.
  • Múltiplas atribuições de clustering podem ser possíveis para um valor de fronteira. Se uma geografia for um valor de fronteira, ST_CLUSTERDBSCAN o designará a um cluster válido arbitrário.

Tipo de retorno

INT64 para cada geografia na coluna geografia.

Este exemplo executa clustering DBSCAN com um raio de 100.000 metros com um argumento minimum_geographies de 1. As geografias sendo analisadas são uma mistura de pontos, linhas e polígonos.

ST_CONTAINS

Descrição

Retorna TRUE se nenhum ponto de geography_2 estiver fora de geography_1, e a intersecção dos interiores retorna FALSE caso contrário.

NOTA: UMA GEOGRAFIA não conter seu próprio limite. Compare com ST_COVERS.

Tipo de retorno

A consulta a seguir testa se o polígono POLYGON ((1 1, 20 1, 10 20, 1 1)) contém cada um dos três pontos (0, 0), (1, 1) e (10, 10), que se encontram no exterior, o limite e o interior do polígono, respectivamente.

ST_CONVEXHULL

Descrição

Retorna o casco convexo para a GEOGRAFIA de entrada. O casco convexo é a menor GEOGRAFIA convexa que cobre a entrada. Uma GEOGRAFIA é convexa se para cada par de pontos na GEOGRAFIA, a borda geodésica que conecta os pontos também está contida na mesma GEOGRAFIA.

Na maioria dos casos, o casco convexo consiste em um único polígono. Casos notáveis ​​incluem o seguinte:

  • O casco convexo de um único ponto também é um ponto.
  • O casco convexo de dois ou mais pontos colineares é uma cadeia de linha, desde que essa cadeia de linha seja convexa.
  • Se a GEOGRAFIA de entrada se estende por mais de um hemisfério, o casco convexo é o globo inteiro. Isso inclui qualquer entrada que contenha um par de pontos antípodas.
  • ST_CONVEXHULL retorna NULL se a entrada for NULL ou GEOGRAPHY vazia.

Tipo de retorno

O casco convexo retornado por ST_CONVEXHULL pode ser um ponto, cadeia de linha ou polígono, dependendo da entrada.

ST_COVEREDBY

Descrição

Retorna FALSE se geography_1 ou geography_2 estiver vazio. Retorna TRUE se nenhum ponto de geography_1 estiver no exterior de geography_2.

Dados dois GEOGRAPHY s a e b, ST_COVEREDBY (a, b) retorna o mesmo resultado que ST_COVERS (b, a). Observe a ordem oposta dos argumentos.

Tipo de retorno

ST_COVERS

Descrição

Retorna FALSE se geography_1 ou geography_2 estiver vazio. Retorna TRUE se nenhum ponto de geography_2 estiver no exterior de geography_1.

Tipo de retorno

A consulta a seguir testa se o polígono POLYGON ((1 1, 20 1, 10 20, 1 1)) cobre cada um dos três pontos (0, 0), (1, 1) e (10, 10), que se encontram no exterior, o limite e o interior do polígono, respectivamente.

ST_DIFFERENCE

Descrição

Retorna uma GEOGRAPHY que representa a diferença do conjunto de pontos de geography_1 e geography_2.

Se geometry_1 estiver completamente contido em geometry_2, ST_DIFFERENCE retornará uma GEOGRAPHY vazia.

Restrições

Os objetos geométricos subjacentes que um BigQuery GEOGRAPHY representa correspondem a um fechado conjunto de pontos. Portanto, ST_DIFFERENCE é o fechamento da diferença do conjunto de pontos de geography_1 e geography_2. Isso implica que, se geography_1 e geography_2 se cruzam, uma parte da fronteira de geography_2 pode estar na diferença.

Tipo de retorno

ST_DIMENSION

Descrição

Retorna a dimensão do elemento de dimensão mais alta na entrada GEOGRAPHY.

A dimensão de cada elemento possível é a seguinte:

  • A dimensão de um ponto é 0.
  • A dimensão de uma cadeia de linha é 1.
  • A dimensão de um polígono é 2.

Se a entrada GEOGRAPHY estiver vazia, ST_DIMENSION retornará -1.

Tipo de retorno

ST_DISJOINT

Descrição

Retorna TRUE se a interseção de geography_1 e geography_2 estiver vazia, ou seja, nenhum ponto em geography_1 também aparece em geography_2.

ST_DISJOINT é a negação lógica de ST_INTERSECTS.

Tipo de retorno

ST_DISTANCE

Descrição

Retorna a distância mais curta em metros entre dois GEOGRAPHY s não vazios.

Se qualquer uma das entradas GEOGRAPHY s estiver vazia, ST_DISTANCE retornará NULL.

O parâmetro opcional use_spheroid determina como essa função mede a distância. Se use_spheroid for FALSE, a função mede a distância na superfície de uma esfera perfeita.

O parâmetro use_spheroid atualmente suporta apenas o valor FALSE. O valor padrão de use_spheroid é FALSE.

Tipo de retorno

ST_DUMP

Descrição

Retorna um ARRAY de GEOGRAPHY s simples, em que cada elemento é um componente da GEOGRAPHY de entrada. Uma GEOGRAFIA simples consiste em um único ponto, sequência de linha ou polígono. Se a entrada GEOGRAPHY for simples, o resultado será um único elemento. Quando a entrada GEOGRAPHY é uma coleção, ST_DUMP retorna um ARRAY com uma GEOGRAPHY simples para cada componente na coleção.

Se a dimensão for fornecida, a função retornará apenas GEOGRAPHY s da dimensão correspondente. Uma dimensão de -1 é equivalente a omitir dimensão.

Tipo de Devolução

O exemplo a seguir mostra como ST_DUMP retorna as geografias simples dentro de uma geografia complexa.

O exemplo a seguir mostra como ST_DUMP com o argumento de dimensão retorna apenas geografias simples da dimensão fornecida.

ST_DWITHIN

Descrição

Retorna TRUE se a distância entre pelo menos um ponto em geography_1 e um ponto em geography_2 for menor ou igual à distância fornecida pelo argumento distance, caso contrário, retorna FALSE. Se alguma das entradas GEOGRAPHY estiver vazia, ST_DWithin retornará FALSE. A distância fornecida está em metros na superfície da Terra.

O parâmetro opcional use_spheroid determina como essa função mede a distância. Se use_spheroid for FALSE, a função mede a distância na superfície de uma esfera perfeita.

O parâmetro use_spheroid atualmente suporta apenas o valor FALSE. O valor padrão de use_spheroid é FALSE.

Tipo de retorno

ST_ENDPOINT

Descrição

Retorna o último ponto de uma geografia de cadeia de linha como uma geografia de ponto. Retorna um erro se a entrada não for uma cadeia de linha ou se a entrada estiver vazia. Use o prefixo SAFE para obter NULL para entrada inválida em vez de um erro.

Tipo de Devolução

ST_EQUALS

Descrição

Retorna TRUE se geography_1 e geography_2 representarem o mesmo

Valor de GEOGRAFIA. Mais precisamente, isso significa que uma das seguintes condições é válida: + ST_COVERS (geography_1, geography_2) = TRUE e ST_COVERS (geography_2, geography_1) = TRUE + Ambos geography_1 e geography_2 estão vazios.

Portanto, duas GEOGRAFIAS podem ser iguais mesmo que a ordenação dos pontos ou vértices seja diferente, desde que ainda representem a mesma estrutura geométrica.

Restrições

ST_EQUALS não tem garantia de ser uma função transitiva.

Tipo de retorno

ST_GEOGFROMGEOJSON

Descrição

Retorna um valor GEOGRAPHY que corresponde à representação GeoJSON de entrada.

ST_GEOGFROMGEOJSON aceita entrada compatível com RFC 7946.

Se o parâmetro make_valid for definido como TRUE, a função tentará reparar os polígonos que não estão em conformidade com a semântica do Open Geospatial Consortium. Este parâmetro usa a sintaxe de argumento nomeado e deve ser especificado usando a sintaxe make_valid = & gt argument_value.

Um BigQuery GEOGRAPHY tem bordas geodésicas esféricas, enquanto um objeto GeoJSON Geometry explicitamente tem bordas planas. Para converter entre esses dois tipos de arestas, o BigQuery adiciona pontos adicionais à linha, quando necessário, para que a sequência de arestas resultante permaneça dentro de 10 metros da borda original.

Consulte ST_ASGEOJSON para formatar uma GEOGRAFIA como GeoJSON.

Restrições

A entrada está sujeita às seguintes restrições:

  • ST_GEOGFROMGEOJSON aceita apenas fragmentos de geometria JSON e não pode ser usado para ingerir um documento JSON inteiro.
  • O fragmento JSON de entrada deve consistir em um tipo de geometria GeoJSON, que inclui Point, MultiPoint, LineString, MultiLineString, Polygon, MultiPolygon e GeometryCollection. Qualquer outro tipo de GeoJSON, como Feature ou FeatureCollection, resultará em erro.
  • Uma posição no membro de coordenadas de um tipo de geometria GeoJSON deve consistir em exatamente dois elementos. O primeiro é a longitude e o segundo é a latitude. Portanto, ST_GEOGFROMGEOJSON não oferece suporte ao terceiro elemento opcional para uma posição no membro de coordenadas.

Tipo de retorno

ST_GEOGFROMTEXT

Assinatura 1

Descrição

Retorna um valor GEOGRAPHY que corresponde à representação WKT de entrada.

Esta função suporta um parâmetro opcional do tipo BOOL, orientado. Se este parâmetro for definido como TRUE, quaisquer polígonos na entrada são considerados orientados da seguinte maneira: se alguém caminhar ao longo do limite do polígono na ordem dos vértices de entrada, o interior do polígono está à esquerda. Isso permite que o WKT represente polígonos maiores que um hemisfério. Se a orientação for FALSE ou omitida, esta função retorna o polígono com a área menor. Veja também ST_MAKEPOLYGONORIENTED que é semelhante a ST_GEOGFROMTEXT com oriented = TRUE.

Para formatar GEOGRAPHY como WKT, use ST_ASTEXT.

Restrições

  • Todas as arestas de entrada são consideradas geodésicas esféricas, e não linhas retas planas. Para ler dados em uma projeção plana, considere o uso de ST_GEOGFROMGEOJSON. Para obter mais informações sobre as diferenças entre geodésicas esféricas e linhas planas, consulte Sistemas de coordenadas e arestas.
  • A função não oferece suporte a geometrias tridimensionais que possuem um sufixo Z, nem oferece suporte a geometrias de sistema de referência linear com um sufixo M.
  • A função só oferece suporte a primitivas de geometria e geometrias de várias partes. Em particular, ele suporta apenas Point, MultiPoint, LineString, MultiLineString, Polygon, MultiPolygon e GeometryCollection.

Tipo de retorno

A consulta a seguir lê a string WKT POLYGON ((0 0, 0 2, 2 2, 2 0, 0 0)) tanto como um polígono não orientado quanto como um polígono orientado e verifica se cada resultado contém o ponto (1, 1).

Assinatura 2

Descrição

Retorna um valor GEOGRAPHY que corresponde à representação WKT de entrada.

Esta função suporta três parâmetros opcionais do tipo BOOL: oriented, planar e make_valid. Esta assinatura usa a sintaxe de argumentos nomeados e os parâmetros devem ser especificados usando a sintaxe parameter_name = & gt parameter_value, em qualquer ordem.

Se o parâmetro orientado for definido como TRUE, quaisquer polígonos na entrada serão considerados orientados da seguinte maneira: se alguém caminhar ao longo do limite do polígono na ordem dos vértices de entrada, o interior do polígono está à esquerda. Isso permite que o WKT represente polígonos maiores que um hemisfério. Se a orientação for FALSE ou omitida, esta função retorna o polígono com a área menor. Veja também ST_MAKEPOLYGONORIENTED que é semelhante a ST_GEOGFROMTEXT com oriented = TRUE.

Se o parâmetro planar estiver definido como TRUE, presume-se que as bordas das strings de linha e polígonos usam a semântica do mapa planar, em vez da semântica geodésica esférica padrão do BigQuery. Para obter mais informações sobre as diferenças entre geodésicas esféricas e linhas planas, consulte Sistemas de coordenadas e arestas.

Se o parâmetro make_valid for definido como TRUE, a função tentará reparar os polígonos que não estão em conformidade com a semântica do Open Geospatial Consortium.

Para formatar GEOGRAPHY como WKT, use ST_ASTEXT.

Restrições

  • Todas as arestas de entrada são consideradas geodésicas esféricas por padrão, e não linhas retas planas. Para ler dados em uma projeção plana, passe o argumento planar = & gt TRUE ou considere o uso de ST_GEOGFROMGEOJSON. Para obter mais informações sobre as diferenças entre geodésicas esféricas e linhas planas, consulte Sistemas de coordenadas e arestas.
  • A função não oferece suporte a geometrias tridimensionais que possuem um sufixo Z, nem oferece suporte a geometrias de sistema de referência linear com um sufixo M.
  • A função só oferece suporte a primitivas de geometria e geometrias de várias partes. Em particular, ele suporta apenas Point, MultiPoint, LineString, MultiLineString, Polygon, MultiPolygon e GeometryCollection.
  • orientado e plano não podem ser iguais a TRUE ao mesmo tempo.
  • orientado e make_valid não podem ser iguais a TRUE ao mesmo tempo.

A consulta a seguir lê a string WKT POLYGON ((0 0, 0 2, 2 2, 0 2, 0 0)) tanto como um polígono não orientado quanto como um polígono orientado e verifica se cada resultado contém o ponto (1, 1).

A consulta a seguir converte uma string WKT com um polígono inválido em GEOGRAPHY. A string WKT viola duas propriedades de um polígono válido - o loop que descreve o polígono não é fechado e contém autointerseção. Com a opção make_valid, ST_GeogFromText converte com sucesso em uma forma multipolígono.

ST_GEOGFROMWKB

Descrição

Converte uma expressão de um valor STRING ou BYTES de texto hexadecimal em um valor GEOGRAPHY. A expressão deve estar no formato WKB.

Para formatar GEOGRAPHY como WKB, use ST_ASBINARY.

Restrições

Todas as arestas de entrada são consideradas geodésicas esféricas, e não linhas retas planas. Para ler dados em uma projeção plana, considere o uso de ST_GEOGFROMGEOJSON.

Tipo de retorno

ST_GEOGPOINT

Descrição

Cria uma GEOGRAFIA com um único ponto. ST_GEOGPOINT cria um ponto a partir dos parâmetros de longitude e latitude FLOAT64 especificados e retorna esse ponto em um valor GEOGRAPHY.

Restrições

  • As latitudes devem estar no intervalo [-90, 90]. Latitudes fora dessa faixa resultarão em erro.
  • Longitudes fora do intervalo [-180, 180] são permitidas. ST_GEOGPOINT usa o módulo de longitude de entrada 360 para obter uma longitude dentro de [-180, 180].

Tipo de retorno

ST_GEOGPOINTFROMGEOHASH

Descrição

Retorna um valor GEOGRAPHY que corresponde a um ponto no meio de uma caixa delimitadora definida no GeoHash.

Tipo de retorno

ST_GEOHASH

Descrição

Retorna uma representação GeoHash de geography_expression. O GeoHash resultante conterá no máximo maxchars caracteres. Menos caracteres correspondem a menor precisão (ou, descrito de forma diferente, a uma caixa delimitadora maior).

ST_GeoHash sobre um objeto GEOGRAPHY vazio retorna NULL.

Restrições

  • Apenas objetos GEOGRAPHY que representam pontos únicos são suportados.
  • O valor máximo de maxchars é 20.

Tipo de retorno

Retorna um GeoHash do Seattle Center com 10 caracteres de precisão.

ST_INTERSECTION

Descrição

Retorna uma GEOGRAPHY que representa a interseção do conjunto de pontos das duas GEOGRAPHY s de entrada. Assim, cada ponto na interseção aparece em geography_1 e geography_2.

Se as duas GEOGRAPHY s de entrada forem disjuntas, ou seja, não houver pontos que apareçam na entrada geometry_1 e geometry_2, então uma GEOGRAPHY vazia será retornada.

Consulte ST_INTERSECTS, ST_DISJOINT para funções de predicado relacionadas.

Tipo de retorno

ST_INTERSECTS

Descrição

Retorna TRUE se a interseção do conjunto de pontos de geography_1 e geography_2 não estiver vazia. Assim, esta função retorna TRUE se houver pelo menos um ponto que apareça em ambas as entradas GEOGRAPHY s.

Se ST_INTERSECTS retornar TRUE, isso implica que ST_DISJOINT retorna FALSE.

Tipo de retorno

ST_INTERSECTSBOX

Descrição

Retorna TRUE se geografia cruzar o retângulo entre [lng1, lng2] e [lat1, lat2]. As bordas do retângulo seguem linhas constantes de longitude e latitude. lng1 e lng2 especificam as linhas de longitude constantes mais a oeste e mais a leste que delimitam o retângulo, e lat1 e lat2 especificam as linhas de latitude constante mínima e máxima que delimitam o retângulo.

Especifique todos os argumentos de longitude e latitude em graus.

Restrições

Os argumentos de entrada estão sujeitos às seguintes restrições:

  • As latitudes devem estar na faixa de [-90, 90] graus.
  • As longitudes devem estar na faixa de [-180, 180] graus.

Tipo de retorno

ST_ISCOLLEÇÃO

Descrição

Retorna TRUE se o número total de pontos, cadeias de linhas e polígonos for maior que um.

Uma GEOGRAFIA vazia não é uma coleção.

Tipo de retorno

ST_ISEMPTY

Descrição

Retorna TRUE se a GEOGRAPHY fornecida estiver vazia, ou seja, a GEOGRAPHY não contém nenhum ponto, linha ou polígono.

OBSERVAÇÃO: uma GEOGRAFIA vazia do BigQuery não está associada a uma forma geométrica específica. Por exemplo, os resultados das expressões ST_GEOGFROMTEXT (& # 39POINT EMPTY & # 39) e ST_GEOGFROMTEXT (& # 39GEOMETRYCOLLECTION EMPTY & # 39) são idênticos.

Tipo de retorno

ST_LENGTH

Descrição

Retorna o comprimento total em metros das linhas na entrada GEOGRAPHY.

Se geography_expression for um ponto ou polígono, retorna zero. Se geography_expression for uma coleção, retorna o comprimento das linhas na coleção se a coleção não contiver linhas, retorna zero.

O parâmetro opcional use_spheroid determina como essa função mede a distância. Se use_spheroid for FALSE, a função mede a distância na superfície de uma esfera perfeita.

O parâmetro use_spheroid atualmente suporta apenas o valor FALSE. O valor padrão de use_spheroid é FALSE.

Tipo de retorno

ST_MAKELINE

Descrição

Cria uma GEOGRAFIA com uma única cadeia de linha, concatenando os vértices do ponto ou da linha de cada uma das GEOGRAFIAS de entrada na ordem em que são fornecidas.

ST_MAKELINE vem em duas variantes. Para a primeira variante, a entrada deve ser duas GEOGRAPHY s. Para o segundo, a entrada deve ser um ARRAY do tipo GEOGRAPHY. Em qualquer uma das variantes, cada GEOGRAFIA de entrada deve consistir em um dos seguintes valores:

Para a primeira variante de ST_MAKELINE, se alguma das entradas GEOGRAPHY for NULL, ST_MAKELINE retornará NULL. Para a segunda variante, se a entrada ARRAY ou qualquer elemento na entrada ARRAY for NULL, ST_MAKELINE retornará NULL.

Restrições

Cada borda deve abranger estritamente menos de 180 graus.

NOTA: o processo de encaixe do BigQuery & # 39s pode descartar bordas suficientemente curtas e encaixar os dois pontos de extremidade. Por exemplo, se duas GEOGRAPHY s de entrada contiverem cada um um ponto e os dois pontos forem separados por uma distância menor que o raio do snap, os pontos serão ajustados juntos. Nesse caso, o resultado será uma GEOGRAFIA com exatamente um ponto.

Tipo de retorno

ST_MAKEPOLYGON

Descrição

Cria uma GEOGRAFIA contendo um único polígono de entradas de cadeia de linha, onde cada cadeia de linha de entrada é usada para construir um anel de polígono.

ST_MAKEPOLYGON vem em duas variantes. Para a primeira variante, a cadeia de linha de entrada é fornecida por uma única GEOGRAFIA contendo exatamente uma cadeia de linha. Para a segunda variante, a entrada consiste em uma única GEOGRAPHY e uma matriz de GEOGRAPHY s, cada uma contendo exatamente uma cadeia de linha. A primeira GEOGRAFIA em qualquer variante é usada para construir a concha poligonal. GEOGRAFIAS adicionais fornecidas na entrada ARRAY especificam um orifício poligonal. Para cada GEOGRAFIA de entrada contendo exatamente uma cadeia de linha, o seguinte deve ser verdadeiro:

  • A cadeia de linha deve consistir em pelo menos três vértices distintos.
  • A cadeia de linha deve ser fechada: ou seja, o primeiro e o último vértice devem ser iguais. Se o primeiro e o último vértices forem diferentes, a função constrói uma aresta final do primeiro vértice ao último.

Para a primeira variante de ST_MAKEPOLYGON, se alguma das entradas GEOGRAPHY for NULL, ST_MAKEPOLYGON retornará NULL. Para a segunda variante, se a entrada ARRAY ou qualquer elemento do ARRAY for NULL, ST_MAKEPOLYGON retornará NULL.

NOTA: ST_MAKEPOLYGON aceita uma GEOGRAPHY vazia como entrada. ST_MAKEPOLYGON interpreta uma GEOGRAFIA vazia como tendo uma cadeia de linha vazia, que criará um loop completo: ou seja, um polígono que cobre toda a Terra.

Restrições

Juntos, os anéis de entrada devem formar um polígono válido:

  • A concha do polígono deve cobrir cada um dos orifícios do polígono.
  • Só pode haver uma concha poligonal (que deve ser o primeiro anel de entrada). Isso implica que os orifícios poligonais não podem ser aninhados.
  • Os anéis poligonais só podem se cruzar em um vértice no limite de ambos os anéis.

Cada borda deve abranger estritamente menos de 180 graus.

Cada anel poligonal divide a esfera em duas regiões. A primeira linha de entrada para ST_MAKEPOLYGON forma a casca do polígono e o interior é escolhido para ser a menor das duas regiões. Cada sequência de linha de entrada subsequente especifica um orifício poligonal, portanto, o interior do polígono já está bem definido. Para definir uma concha poligonal de forma que o interior do polígono seja a maior das duas regiões, consulte ST_MAKEPOLYGONORIENTED.

NOTA: o processo de encaixe do BigQuery & # 39s pode descartar bordas suficientemente curtas e encaixar os dois pontos de extremidade. Portanto, quando os vértices são encaixados, é possível que um orifício poligonal que seja suficientemente pequeno possa desaparecer ou a GEOGRAFIA de saída pode conter apenas uma linha ou um ponto.

Tipo de retorno

ST_MAKEPOLYGONORIENTED

Descrição

Como ST_MAKEPOLYGON, mas a ordem dos vértices de cada cadeia de linha de entrada determina a orientação de cada anel poligonal. A orientação de um anel poligonal define o interior do polígono da seguinte maneira: se alguém caminhar ao longo do limite do polígono na ordem dos vértices de entrada, o interior do polígono está à esquerda. Isso se aplica a cada anel poligonal fornecido.

Essa variante do construtor de polígono é mais flexível, pois ST_MAKEPOLYGONORIENTED pode construir um polígono de forma que o interior fique em qualquer um dos lados do anel poligonal. No entanto, a orientação adequada dos anéis poligonais é crítica para construir o polígono desejado.

Se a entrada ARRAY ou qualquer elemento em ARRAY for NULL, ST_MAKEPOLYGONORIENTED retornará NULL.

NOTA: O argumento de entrada para ST_MAKEPOLYGONORIENTED pode conter uma GEOGRAFIA vazia. ST_MAKEPOLYGONORIENTED interpreta uma GEOGRAFIA vazia como tendo uma cadeia de linha vazia, que criará um loop completo: ou seja, um polígono que cobre toda a Terra.

Restrições

Juntos, os anéis de entrada devem formar um polígono válido:

  • A concha do polígono deve cobrir cada um dos orifícios do polígono.
  • Deve haver apenas uma concha poligonal, que deve ser o primeiro anel de entrada. Isso implica que os orifícios poligonais não podem ser aninhados.
  • Os anéis poligonais só podem se cruzar em um vértice no limite de ambos os anéis.

Cada borda deve abranger estritamente menos de 180 graus.

ST_MAKEPOLYGONORIENTED depende da ordem dos vértices de entrada de cada cadeia de linha para determinar a orientação do polígono. Isso se aplica à concha poligonal e a quaisquer orifícios poligonais. ST_MAKEPOLYGONORIENTED espera que todos os orifícios do polígono tenham a orientação oposta da casca. Consulte ST_MAKEPOLYGON para um construtor de polígono alternativo e outras restrições na construção de um polígono válido.

OBSERVAÇÃO: devido ao processo de encaixe do BigQuery & # 39s, as arestas com comprimento suficientemente curto serão descartadas e os dois pontos finais serão encaixados em um único ponto. Portanto, é possível que os vértices em uma cadeia de linha sejam encaixados de forma que uma ou mais arestas desapareçam. Portanto, é possível que um buraco poligonal que seja suficientemente pequeno possa desaparecer, ou a GEOGRAFIA resultante pode conter apenas uma linha ou um ponto.

Tipo de retorno

ST_MAXDISTANCE

Retorna a maior distância em metros entre duas GEOGRAFIAS não vazias, ou seja, a distância entre dois vértices onde o primeiro vértice está na primeira GEOGRAFIA e o segundo vértice está na segunda GEOGRAFIA. Se geography_1 e geography_2 são a mesma GEOGRAPHY, a função retorna a distância entre os dois vértices mais distantes dessa GEOGRAPHY.

Se qualquer uma das entradas GEOGRAPHY s estiver vazia, ST_MAXDISTANCE retornará NULL.

O parâmetro opcional use_spheroid determina como essa função mede a distância. Se use_spheroid for FALSE, a função mede a distância na superfície de uma esfera perfeita.

O parâmetro use_spheroid atualmente suporta apenas o valor FALSE. O valor padrão de use_spheroid é FALSE.

Tipo de retorno

ST_NPOINTS

Descrição

ST_NUMPOINTS

Descrição

Retorna o número de vértices na GEOGRAFIA de entrada. Isso inclui o número de pontos, o número de vértices de cadeia de linha e o número de vértices poligonais.

NOTA: O primeiro e o último vértice de um anel poligonal são contados como vértices distintos.

Tipo de retorno

ST_PERIMETER

Descrição

Retorna o comprimento em metros do limite dos polígonos na entrada GEOGRAFIA.

Se geography_expression for um ponto ou uma linha, retorna zero. Se geography_expression for uma coleção, retorna o perímetro dos polígonos na coleção, se a coleção não contiver polígonos, retorna zero.

O parâmetro opcional use_spheroid determina como essa função mede a distância. Se use_spheroid for FALSE, a função mede a distância na superfície de uma esfera perfeita.

O parâmetro use_spheroid atualmente suporta apenas o valor FALSE. O valor padrão de use_spheroid é FALSE.

Tipo de retorno

ST_POINTN

Descrição

Retorna o enésimo ponto de uma geografia de cadeia de linha como uma geografia de ponto, onde N é o índice. O índice é baseado em 1. Os valores negativos são contados regressivamente a partir do final da cadeia de linha, de modo que -1 é o último ponto. Retorna um erro se a entrada não for uma cadeia de linha, se a entrada estiver vazia ou se não houver vértice no índice fornecido. Use o prefixo SAFE para obter NULL para entrada inválida em vez de um erro.

Tipo de Devolução

O exemplo a seguir usa ST_POINTN, ST_STARTPOINT e ST_ENDPOINT para extrair pontos de uma cadeia de linha.

ST_SIMPLIFY

Descrição

Retorna uma versão simplificada da geografia, a entrada fornecida GEOGRAPHY. A entrada GEOGRAFIA é simplificada pela substituição de cadeias quase retas de bordas curtas por uma única borda longa. A geografia de entrada não mudará mais do que a tolerância especificada por tolerance_meters. Assim, as arestas simplificadas têm a garantia de passar dentro dos tolerance_meters do original posições de todos os vértices que foram removidos dessa aresta. Os tolerance_meters fornecidos estão em metros na superfície da Terra.

Observe que ST_SIMPLIFY preserva relacionamentos topológicos, o que significa que nenhuma nova aresta cruzada será criada e a saída será válida. Para uma tolerância grande o suficiente, as formas adjacentes podem se transformar em um único objeto ou uma forma pode ser simplificada para uma forma com uma dimensão menor.

Restrições

Para que ST_SIMPLIFY tenha algum efeito, tolerance_meters deve ser diferente de zero.

ST_SIMPLIFY retorna um erro se a tolerância especificada por tolerance_meters for uma das seguintes:

  • Uma tolerância negativa.
  • Maior que

Tipo de retorno

O exemplo a seguir mostra como ST_SIMPLIFY simplifica a linha de entrada GEOGRAPHY removendo vértices intermediários.

O exemplo a seguir ilustra como o resultado de ST_SIMPLIFY pode ter uma dimensão menor do que a forma original.

ST_SNAPTOGRID

Descrição

Retorna a entrada GEOGRAPHY, onde cada vértice foi encaixado em uma grade de longitude / latitude. O tamanho da grade é determinado pelo parâmetro grid_size que é dado em graus.

Restrições

Tamanhos de grade arbitrários não são suportados. O parâmetro grid_size é arredondado para que fique no formato (10 ​​^ n ), onde (- 10 & lt n & lt 0 ).

Tipo de retorno

ST_STARTPOINT

Descrição

Retorna o primeiro ponto de uma geografia de cadeia de linha como uma geografia de ponto. Retorna um erro se a entrada não for uma cadeia de linha ou se a entrada estiver vazia. Use o prefixo SAFE para obter NULL para entrada inválida em vez de um erro.

Tipo de Devolução

ST_TOUCHES

Descrição

Retorna TRUE, desde que as duas condições a seguir sejam satisfeitas:

  1. geography_1 cruza geography_2.
  2. O interior de geography_1 e o interior de geography_2 são disjuntos.

Tipo de retorno

ST_UNION

Descrição

Retorna uma GEOGRAPHY que representa a união do conjunto de pontos de todas as GEOGRAPHY s de entrada.

ST_UNION vem em duas variantes. Para a primeira variante, a entrada deve ser duas GEOGRAPHY s. Para o segundo, a entrada é um ARRAY do tipo GEOGRAPHY.

Para a primeira variante de ST_UNION, se uma entrada GEOGRAPHY for NULL, ST_UNION retornará NULL. Para a segunda variante, se o valor de entrada ARRAY for NULL, ST_UNION retornará NULL. Para um ARRAY de entrada não NULL, a união é calculada e os elementos NULL são ignorados para que não afetem a saída.

Consulte ST_UNION_AGG para a versão agregada de ST_UNION.

Tipo de retorno

ST_UNION_AGG

Descrição

Retorna uma GEOGRAPHY que representa a união do conjunto de pontos de todas as GEOGRAPHY s de entrada.

ST_UNION_AGG ignora os valores de GEOGRAPHY de entrada NULL.

Consulte ST_UNION para a versão não agregada de ST_UNION_AGG.

Tipo de retorno

ST_WITHIN

Descrição

Retorna TRUE se nenhum ponto de geography_1 estiver fora de geography_2 e os interiores de geography_1 e geography_2 se cruzarem.

Dadas duas geografias a e b, ST_WITHIN (a, b) retorna o mesmo resultado que ST_CONTAINS (b, a). Observe a ordem oposta dos argumentos.

Tipo de retorno

Descrição

Retorna a longitude em graus da GEOGRAFIA de entrada de ponto único.

Para qualquer GEOGRAPHY de entrada que não seja um único ponto, incluindo uma GEOGRAPHY vazia, ST_X retorna um erro. Use o SEGURO. prefixo para obter NULL.

Tipo de retorno

O exemplo a seguir usa ST_X e ST_Y para extrair coordenadas de geografias de ponto único.

Descrição

Retorna a latitude em graus da GEOGRAFIA de entrada de ponto único.

Para qualquer GEOGRAFIA de entrada que não seja um único ponto, incluindo uma GEOGRAFIA vazia, ST_Y retorna um erro. Use o SEGURO. prefixo para retornar NULL.

Tipo de retorno

Exceto quando indicado de outra forma, o conteúdo desta página está licenciado pela Licença Creative Commons Atribuição 4.0, e os exemplos de código são licenciados pela Licença Apache 2.0. Para obter detalhes, consulte as políticas de sites para desenvolvedores do Google. Java é uma marca registrada da Oracle e / ou de suas afiliadas.


13.3.2. Dados vetoriais¶

Muitos dos recursos e ferramentas disponíveis no QGIS funcionam da mesma forma, independentemente da fonte de dados vetoriais. No entanto, devido às diferenças nas especificações de formato (formatos de arquivo GeoPackage, ESRI Shapefile, MapInfo e MicroStation, AutoCAD DXF, PostGIS, SpatiaLite, DB2, Oracle Spatial, bancos de dados MSSQL Spatial e muitos mais), o QGIS pode lidar com algumas de suas propriedades de maneira diferente . O suporte é fornecido pela OGR Simple Feature Library. Esta seção descreve como trabalhar com essas especificidades.

O QGIS suporta os tipos de recurso (multi) ponto, (multi) linha, (multi) polígono, CircularString, CompoundCurve, CurvePolygon, MultiCurve, MultiSurface, todos opcionalmente com valores Z e / ou M.

Você também deve observar que alguns drivers não suportam alguns desses tipos de recurso, como CircularString, CompoundCurve, CurvePolygon, MultiCurve, tipo de recurso MultiSurface. QGIS irá convertê-los.

13.3.2.1. GeoPackage¶

O formato GeoPackage (GPKG) é independente de plataforma e é implementado como um contêiner de banco de dados SQLite e pode ser usado para armazenar dados vetoriais e raster. O formato foi definido pelo Open Geospatial Consortium (OGC), e foi publicado em 2014.

GeoPackage pode ser usado para armazenar o seguinte em um banco de dados SQLite:

vetor recursos

conjuntos de imagens de matriz de blocos e raster mapas

atributos (dados não espaciais)

Desde o QGIS versão 3.8, GeoPackage também pode armazenar projetos QGIS. As camadas do GeoPackage podem ter campos JSON.

GeoPackage é o formato padrão para dados vetoriais no QGIS.

13.3.2.2. Formato ESRI Shapefile¶

O formato ESRI Shapefile ainda é um dos formatos de arquivo vetorial mais usados, mesmo que tenha algumas limitações em comparação com, por exemplo, GeoPackage e SpatiaLite.

Um conjunto de dados de formato ESRI Shapefile consiste em vários arquivos. Os três seguintes são obrigatórios:

Arquivo .shp contendo as geometrias do recurso

Arquivo .dbf contendo os atributos no formato dBase

Um conjunto de dados de formato ESRI Shapefile também pode incluir um arquivo com um sufixo .prj, que contém informações de projeção. Embora seja muito útil ter um arquivo de projeção, não é obrigatório. Um conjunto de dados de formato Shapefile pode conter arquivos adicionais. Para obter mais detalhes, consulte as especificações técnicas da ESRI em https://www.esri.com/library/whitepapers/pdfs/shapefile.pdf.

GDAL 3.1 tem suporte de leitura e gravação para formato ESRI Shapefile compactado (shz e shp.zip).

Melhorando o desempenho para conjuntos de dados de formato ESRI Shapefile

Para melhorar o desempenho do desenho para um conjunto de dados de formato ESRI Shapefile, você pode criar um índice espacial. Um índice espacial melhorará a velocidade de zoom e panorâmica. Os índices espaciais usados ​​pelo QGIS têm uma extensão .qix.

Use estas etapas para criar o índice:

Carregar um conjunto de dados de formato ESRI Shapefile (consulte O painel do navegador)

Abra a caixa de diálogo Propriedades da camada clicando duas vezes no nome da camada na legenda ou clicando com o botão direito e escolhendo Propriedades ... no menu de contexto

Na guia Fonte, clique no botão Criar Índice Espacial

Problema ao carregar um arquivo .prj

Se você carregar um conjunto de dados de formato ESRI Shapefile com um arquivo .prj e o QGIS não for capaz de ler o sistema de referência de coordenadas desse arquivo, você precisará definir a projeção adequada manualmente na guia Propriedades da camada ► Fonte da camada clicando no Selecione o botão CRS. Isso se deve ao fato de que os arquivos .prj geralmente não fornecem os parâmetros de projeção completos conforme usados ​​no QGIS e listados na caixa de diálogo CRS.

Pelo mesmo motivo, se você criar um novo conjunto de dados de formato ESRI Shapefile com QGIS, dois arquivos de projeção diferentes são criados: um arquivo .prj com parâmetros de projeção limitados, compatível com software ESRI, e um arquivo .qpj, fornecendo todos os parâmetros do CRS. Sempre que o QGIS encontrar um arquivo .qpj, ele será usado no lugar do .prj.

13.3.2.3. Arquivos de texto delimitados¶

Arquivos de texto delimitados são muito comuns e amplamente usados ​​devido à sua simplicidade e legibilidade - os dados podem ser visualizados e editados em um editor de texto simples. Um arquivo de texto delimitado são dados tabulares com colunas separadas por um caractere definido e linhas separadas por quebras de linha. A primeira linha geralmente contém os nomes das colunas. Um tipo comum de arquivo de texto delimitado é CSV (Comma Separated Values), com colunas separadas por vírgulas. Os arquivos de texto delimitados também podem conter informações posicionais (consulte Armazenamento de informações de geometria em arquivos de texto delimitados).

O QGIS permite que você carregue um arquivo de texto delimitado como uma camada ou uma tabela comum (veja O Painel do Navegador ou Importando um arquivo de texto delimitado). Primeiro, verifique se o arquivo atende aos seguintes requisitos:

O arquivo deve ter uma linha de cabeçalho delimitada de nomes de campo. Esta deve ser a primeira linha dos dados (de preferência, a primeira linha no arquivo de texto).

Se a geometria deve ser habilitada, o arquivo deve conter campo (s) que definem a geometria. Esses campos podem ter qualquer nome.

Os campos de coordenadas X e Y (se a geometria for definida por coordenadas) devem ser especificados como números. O sistema de coordenadas não é importante.

Se você tiver um arquivo CSV com colunas não string, deve ter um arquivo CSVT que o acompanha (consulte a seção Usando o arquivo CSVT para controlar a formatação do campo).

O arquivo de dados do ponto de elevação elevp.csv no conjunto de dados de amostra QGIS (consulte a seção Baixando dados de amostra) é um exemplo de arquivo de texto válido:

Algumas coisas a serem observadas sobre o arquivo de texto:

O arquivo de texto de exemplo usa (ponto-e-vírgula) como delimitador (qualquer caractere pode ser usado para delimitar os campos).

A primeira linha é a linha do cabeçalho. Ele contém os campos X, Y e ELEV.

Sem aspas (& quot) são usadas para delimitar campos de texto

As coordenadas X estão contidas no campo X

As coordenadas Y estão contidas no campo Y

13.3.2.3.1. Armazenando informações de geometria em arquivos de texto delimitados¶

Arquivos de texto delimitados podem conter informações de geometria em duas formas principais:

Como coordenadas em colunas separadas (por exemplo, Xcol, Ycol ...), para dados de geometria de ponto

Como representação de texto conhecido (WKT) da geometria em uma única coluna, para qualquer tipo de geometria.

Recursos com geometrias curvas (CircularString, CurvePolygon e CompoundCurve) são suportados. Aqui estão alguns exemplos de tipos de geometria em um arquivo de texto delimitado com geometrias codificadas como WKT:

Arquivos de texto delimitados também suportam coordenadas Z e M em geometrias:

13.3.2.3.2. Usando o arquivo CSVT para controlar a formatação do campo¶

Ao carregar arquivos CSV, o driver OGR assume que todos os campos são strings (ou seja, texto), a menos que seja informado o contrário. Você pode criar um arquivo CSVT para informar ao OGR (e QGIS) o tipo de dados das diferentes colunas:

DateTime (AAAA-MM-DD HH: MM: SS + nn)

O arquivo CSVT é um Uma linha arquivo de texto simples com os tipos de dados entre aspas e separados por vírgulas, por exemplo:

Você pode até especificar a largura e a precisão de cada coluna, por exemplo:

Este arquivo é salvo na mesma pasta que o arquivo .csv, com o mesmo nome, mas .csvt como a extensão.

Você pode encontrar mais informações em Driver GDAL CSV.

13.3.2.4. Camadas PostGIS¶

As camadas PostGIS são armazenadas em um banco de dados PostgreSQL. As vantagens do PostGIS são os recursos de indexação espacial, filtragem e consulta. Usando PostGIS, funções vetoriais como selecionar e identificar funcionam com mais precisão do que com camadas OGR no QGIS.

Camadas PostGIS

Normalmente, uma camada PostGIS é identificada por uma entrada na tabela geometry_columns. O QGIS pode carregar camadas que não possuem uma entrada na tabela geometry_columns. Isso inclui tabelas e visualizações. Consulte o manual do PostgreSQL para obter informações sobre a criação de visualizações.

Esta seção contém alguns detalhes sobre como o QGIS acessa as camadas do PostgreSQL. Na maioria das vezes, o QGIS deve simplesmente fornecer a você uma lista de tabelas de banco de dados que podem ser carregadas, e ele as carregará quando solicitado. No entanto, se você tiver problemas para carregar uma tabela PostgreSQL no QGIS, as informações abaixo podem ajudá-lo a entender as mensagens QGIS e fornecer instruções para modificar a tabela PostgreSQL ou a definição da visualização para permitir que o QGIS as carregue.

13.3.2.4.1. Chave primária¶

O QGIS requer que as camadas PostgreSQL contenham uma coluna que pode ser usada como uma chave única para a camada. Para tabelas, isso geralmente significa que a tabela precisa de uma chave primária ou de uma coluna com uma restrição exclusiva. No QGIS, esta coluna precisa ser do tipo int4 (um inteiro de 4 bytes). Alternativamente, a coluna ctid pode ser usada como chave primária. Se uma tabela não tiver esses itens, a coluna oid será usada em seu lugar. O desempenho será melhorado se a coluna for indexada (observe que as chaves primárias são indexadas automaticamente no PostgreSQL).

QGIS oferece uma caixa de seleção Selecione no id que é ativado por padrão. Esta opção obtém os ids sem os atributos, o que é mais rápido na maioria dos casos.

13.3.2.4.2. Visualizar¶

Se a camada PostgreSQL for uma visão, o mesmo requisito existe, mas as visões nem sempre têm chaves primárias ou colunas com restrições exclusivas. Você deve definir um campo de chave primária (deve ser inteiro) na caixa de diálogo QGIS antes de carregar a visualização. Se uma coluna adequada não existir na visualização, o QGIS não carregará a camada. Se isso ocorrer, a solução é alterar a visualização para que inclua uma coluna adequada (um tipo de inteiro e uma chave primária ou com uma restrição única, de preferência indexada).

Quanto à mesa, uma caixa de seleção Selecione no id está ativado por padrão (veja acima o significado da caixa de seleção). Pode fazer sentido desabilitar essa opção ao usar visualizações caras.

13.3.2.4.3. Tabela QGIS layer_style e backup de banco de dados¶

Se você deseja fazer um backup de seu banco de dados PostGIS usando os comandos pg_dump e pg_restore, e os estilos de camada padrão salvos pelo QGIS falham ao restaurar depois, você precisa definir a opção XML para DOCUMENT antes do comando de restauração:

13.3.2.4.4. Filtrar lado do banco de dados¶

QGIS permite filtrar recursos já no lado do servidor. Verifique as configurações ► Opções ► Fontes de dados ► Executar expressões no lado do servidor, se possível. Apenas expressões suportadas serão enviadas ao banco de dados. As expressões que usam operadores ou funções sem suporte retornarão normalmente à avaliação local.

13.3.2.4.5. Suporte de tipos de dados PostgreSQL¶

Os tipos de dados suportados pelo provedor PostgreSQL incluem: integer, float, boolean, objeto binário, varchar, geometry, timestamp, array, hstore e json.

13.3.2.5. Importando dados para PostgreSQL¶

Os dados podem ser importados para PostgreSQL / PostGIS usando várias ferramentas, incluindo o plugin DB Manager e as ferramentas de linha de comando shp2pgsql e ogr2ogr.

13.3.2.5.1. DB Manager¶

QGIS vem com um plugin central denominado DB Manager. Ele pode ser usado para carregar dados e inclui suporte para esquemas. Consulte a seção Plug-in do DB Manager para obter mais informações.

13.3.2.5.2. shp2pgsql¶

PostGIS inclui um utilitário chamado shp2pgsql, que pode ser usado para importar conjuntos de dados em formato Shapefile para um banco de dados habilitado para PostGIS. Por exemplo, para importar um conjunto de dados no formato Shapefile denominado lakes.shp para um banco de dados PostgreSQL denominado gis_data, use o seguinte comando:

Isso cria uma nova camada chamada lakes_new no banco de dados gis_data. A nova camada terá um identificador de referência espacial (SRID) de 2964. Consulte a seção Trabalhando com Projeções para obter mais informações sobre sistemas de referência espacial e projeções.

Exportando conjuntos de dados de PostGIS

Também existe uma ferramenta para exportar conjuntos de dados PostGIS para o formato Shapefile: pgsql2shp. Ele é enviado em sua distribuição PostGIS.

13.3.2.5.3. ogr2ogr¶

Além de shp2pgsql e DB Manager, existe outra ferramenta para alimentar dados geográficos em PostGIS: ogr2ogr. Faz parte da instalação do GDAL.

Para importar um conjunto de dados de formato Shapefile para PostGIS, faça o seguinte:

Isso importará o conjunto de dados de formato Shapefile alaska.shp para o banco de dados PostGIS postgis usando o usuário postgres com a senha ultra secreto no servidor host myhost.de.

Observe que OGR deve ser construído com PostgreSQL para suportar PostGIS. Você pode verificar isso digitando (in):

Se você preferir usar o PostgreSQL's CÓPIA DE comando em vez do padrão INSIRA DENTRO DE método, você pode exportar a seguinte variável de ambiente (pelo menos disponível em e ):

ogr2ogr não cria índices espaciais como shp2pgsl faz. Você precisa criá-los manualmente, usando o comando SQL normal CRIAR ÍNDICE depois, como uma etapa extra (conforme descrito na próxima seção Melhorando o desempenho).

13.3.2.5.4. Melhorando a performance¶

A recuperação de recursos de um banco de dados PostgreSQL pode ser demorada, especialmente em uma rede. Você pode melhorar o desempenho do desenho das camadas PostgreSQL garantindo que um índice espacial PostGIS exista em cada camada do banco de dados. PostGIS suporta a criação de um índice GiST (Generalized Search Tree) para acelerar a pesquisa espacial (as informações do índice GiST são obtidas na documentação PostGIS disponível em https://postgis.net).

Você pode usar o DBManager para criar um índice para sua camada. Você deve primeiro selecionar a camada e clicar em Tabela ► Editar tabela, ir para a aba Índices e clicar em Adicionar Índice Espacial.

A sintaxe para criar um índice GiST é:

Observe que, para tabelas grandes, a criação do índice pode levar muito tempo. Uma vez que o índice é criado, você deve executar uma ANÁLISE DE VÁCUO. Consulte a documentação PostGIS (POSTGIS-PROJECT em Literatura e Referências da Web) para obter mais informações.

O exemplo a seguir cria um índice GiST:

13.3.2.6. Camadas de vetor cruzando 180 ° de longitude¶

Muitos pacotes GIS não envolvem mapas vetoriais com um sistema de referência geográfica (lat / lon) cruzando a linha de longitude de 180 graus (http://postgis.refractions.net/documentation/manual-2.0/ST_Shift_Longitude.html). Como resultado, se abrirmos esse mapa no QGIS, poderemos ver dois locais amplamente separados, que devem aparecer próximos um do outro. Na Fig. 13.23, o pequeno ponto na extremidade esquerda da tela do mapa (Ilhas Chatham) deve estar dentro da grade, à direita das ilhas principais da Nova Zelândia.

Fig. 13.23 Mapa em lat / lon cruzando a linha de longitude 180 ° °

Uma solução alternativa é transformar os valores de longitude usando PostGIS e o ST_Shift_Longitude função. Esta função lê cada ponto / vértice em cada componente de cada recurso em uma geometria e, se a coordenada de longitude for & lt 0 °, ela adiciona 360 ° a ela. O resultado é uma versão de 0 ° - 360 ° dos dados a serem plotados em um mapa centralizado em 180 °.

Fig. 13.24 Cruzando 180 ° de longitude aplicando o ST_Shift_Longitude função ¶

13.3.2.6.1. Uso¶

Importe dados para PostGIS (Importing Data into PostgreSQL) usando, por exemplo, o plugin DB Manager.

Use a interface de linha de comando PostGIS para emitir o seguinte comando (neste exemplo, “TABLE” é o nome real de sua tabela PostGIS): gis_data = # update TABLE set the_geom = ST_Shift_Longitude (the_geom)

Se tudo correu bem, você deve receber uma confirmação sobre o número de recursos que foram atualizados. Então você poderá carregar o mapa e ver a diferença (Figure_vector_crossing_map).

13.3.2.7. Camadas SpatiaLite¶

Se quiser salvar uma camada vetorial usando o formato SpatiaLite, você pode fazer isso seguindo as instruções em Criando novas camadas a partir de uma camada existente. Você seleciona SpatiaLite como formato e insere o nome do arquivo e o nome da camada.

Além disso, você pode selecionar SQLite como formato e adicionar SPATIALITE = YES no campo Opções personalizadas ► Fonte de dados. Isso informa ao GDAL para criar um banco de dados SpatiaLite. Veja também https://gdal.org/drivers/vector/sqlite.html.

QGIS também suporta visualizações editáveis ​​em SpatiaLite. Para gerenciamento de dados SpatiaLite, você também pode usar o plugin principal DB Manager.

Se você deseja criar uma nova camada SpatiaLite, consulte a seção Criando uma nova camada SpatiaLite.

13.3.2.8. Parâmetros específicos do GeoJSON¶

Ao exportar camadas para GeoJSON, existem algumas opções de camadas específicas disponíveis. Essas opções vêm do GDAL, que é responsável pela gravação do arquivo:

COORDINATE_PRECISION o número máximo de dígitos após o separador decimal para escrever em coordenadas. O padrão é 15 (nota: para as coordenadas Lat Lon 6 é considerado suficiente). O truncamento ocorrerá para remover os zeros à direita.

RFC7946 por padrão, GeoJSON 2008 será usado. Se definido como SIM, o padrão RFC 7946 atualizado será usado. O padrão é NÃO (portanto, GeoJSON 2008). Veja https://gdal.org/drivers/vector/geojson.html#rfc-7946-write-support para as principais diferenças, em resumo: apenas EPSG: 4326 é permitido, outros crs serão transformados, polígonos serão escritos como para seguir a regra da mão direita para orientação, os valores de um array “bbox” são [oeste, sul, leste, norte], não [minx, miny, maxx, maxy]. Alguns nomes de membros de extensão são proibidos em objetos FeatureCollection, Feature e Geometry, a precisão da coordenada padrão é de 7 dígitos decimais

WRITE_BBOX definido como YES para incluir a caixa delimitadora das geometrias no nível de recurso e coleção de recursos

Além do GeoJSON, também existe a opção de exportar para “GeoJSON - Newline Delimited” (consulte https://gdal.org/drivers/vector/geojsonseq.html). Em vez de um FeatureCollection com Features, você pode transmitir um tipo (provavelmente apenas Features) sequencialmente separado por novas linhas.

GeoJSON - Newline Delimited também tem algumas opções de camadas específicas disponíveis:

COORDINATE_PRECISION ver acima (o mesmo que para GeoJSON)

RS se deve iniciar registros com o caractere RS = 0x1E. A diferença é como os recursos são separados: apenas por um caractere de nova linha (LF) (JSON delimitado por nova linha, geojsonl) ou também acrescentando um caractere separador de registro (RS) (dando sequências de texto GeoJSON, geojsons). Padrão para NÃO. Os arquivos recebem a extensão .json se a extensão não for fornecida.

13.3.2.9. Camadas espaciais do DB2¶

Os produtos IBM DB2 para Linux, Unix e Windows (DB2 LUW), IBM DB2 para z / OS (mainframe) e IBM DashDB permitem que os usuários armazenem e analisem dados espaciais em colunas de tabelas relacionais. O provedor DB2 para QGIS oferece suporte a toda a gama de visualização, análise e manipulação de dados espaciais nesses bancos de dados.

A documentação do usuário sobre esses recursos pode ser encontrada em DB2 z / OS KnowledgeCenter, DB2 LUW KnowledgeCenter e DB2 DashDB KnowledgeCenter.

Para obter mais informações sobre como trabalhar com os recursos espaciais do DB2, verifique o Tutorial do DB2 Spatial no IBM DeveloperWorks.

O provedor do DB2 atualmente suporta apenas o ambiente Windows por meio do driver ODBC do Windows.

O cliente que executa o QGIS precisa ter um dos seguintes instalados:

Pacote IBM Data Server Driver

Para abrir dados do DB2 no QGIS, consulte o Painel do navegador ou seção Carregando uma camada de banco de dados.

Se você estiver acessando um banco de dados DB2 LUW na mesma máquina ou usando o DB2 LUW como cliente, os executáveis ​​e arquivos de suporte do DB2 precisam ser incluídos no caminho do Windows. Isso pode ser feito criando um arquivo em lote como o seguinte com o nome db2.bat e incluindo-o no diretório % OSGEO4W_ROOT% / etc / ini:


Comentários para este artigo

Útil apenas quando você mora nos EUA,

Como você faz isso no Reino Unido ou na Irlanda, quando os mapas não são criados por padrão?

Obrigado pelo tutorial. Ajudou imensamente, no entanto, estou trabalhando com uma tabela com mais de 40.000 linhas, então atualizar cada uma individualmente não era realmente uma opção para mim. Para contornar isso, usei a seguinte consulta:

ATUALIZAR us_loc_data SET GeoLocation = geography :: Point (b.latitude, b.longitude, 4326)
FROM us_loc_data2 AS A
JOIN us_loc_data B em (A.zip = b.zip)

Isso atualizou todas as minhas linhas simultaneamente.

Muito útil, no entanto, quero fazer algo assim.
Para todas as coordenadas (spatialData), tenho imagens separadas armazenadas no banco de dados. Então, em vez de usar alguns marcadores embutidos como tachinha, como posso usar essas imagens do banco de dados para visualizar cada coordenada no mapa. Ou em seu exemplo acima, como posso substituir alfinetes por imagens exclusivas para representar esses códigos postais?

Muito obrigado e qualquer ajuda / ideias seria muito apreciada.

Ótimo artigo. Este é o artigo que procuro.

Tenho dados de uso de peças sobressalentes que são agregados por CEP. Como eu poderia mostrar o uso das peças no mapa pelo CEP.

É adicionar uma camada e usar a consulta para fazer isso? Eu não tenho muita certeza,

Por exemplo, SELECT ZIP, use FROM usage_data

Comunidade e loja online completas para embelezar sua vida digital. Computadores e produtos eletrônicos de amplificação. Qualidade e preço acessível

Estou tentando acompanhar e esta é a mensagem de erro que estou recebendo.

Incapaz de determinar o tipo de dados espaciais no conjunto de dados especificado.

É assim que os dados se parecem quando eu os executo no SSMS

50001 IA ACKWORTH 41.364 93.4245 0xE6100000010C3BDF4F8D97AE4440BA490C022B5B5740
50002 IA ADAIR 41.5092 94.6468 0xE6100000010CC58F31772DC1444061C3D32B65A95740
50003 IA ADEL 41.6119 94.026 0xE6100000010C11363CBD52CE44408B6CE7FBA9815740
50005 IA ALBION 42.1277 93.0148 0xE6100000010C7FD93D7958104540C5FEB27BF2405740

Quando eu executo a consulta no SSRS, é assim que os dados se parecem

50001 I A ACKWORTH 41.364 93.4245 POINT (93,4245 41,364)
50002 I A ADAIR 41.5092 94.6468 POINT (94,6468 41,5092)
50003 I A ADEL 41.6119 94.026 POINT (94.026 41.6119)
50005 I A ALBION 42.1277 93.0148 POINT (93.0148 42.1277)

Você pode me dizer o que estou fazendo de errado? Eu sou novo no SSRS e gostaria muito de fazer isso funcionar.

O uso de CONVERT reterá apenas 3 dígitos à direita do decimal. Em vez disso, use STR (, 15, 10)

atualizar ZipCodes SET SpatialData = 'POINT (' + STR ([Longitude], 15, 10) + '' + STR ([Latitude], 15, 10) + ')' de ZipCodes

Ao lidar com endereços residenciais, você realmente precisa de precisão extra.

Olá, infelizmente no meu datawarehose trabalho com banco de dados oracle (que é impossível mudar para atender aos padrões), por favor, poderia mostrar um exemplo de carregamento de dados (longitude e latitude, POINT (-64.447090448866433 -31.731954802667566)) de um banco de dados oracle.

Desde ja muito obrigado

Obrigada. Isso foi atualizado.

Obrigada,
Jeremy Kadlec
Co-líder da comunidade MSSQLTips.com

Exemplo útil.Para sua informação, a instrução UPDATE acima está faltando o sinal negativo nas longitudes. Assim, os pontos específicos acabam no Tibete. :)

Pergunta: Eu tenho um mapa dos EUA com vários pontos que têm 2 ou 3 pontos muito próximos. Eu gostaria de usar LABELS para os pontos para fornecer os números das lojas, mas agora os rótulos estão todos empilhados uns sobre os outros. Existe uma maneira de exibir o rótulo - como em um gráfico - onde uma linha preta fina se conecta ao ponto real? Obrigado

Olá, estou trabalhando no mapa do relatório há alguns dias. meu ingresso é criar um mapa de relatório para a localização da Loja na Flórida.

o relatório mostrará o mapa da Flórida no mapa terá condados e em cada condado terá um número diferente de loja, por exemplo, no condado de Leon tem a Loja 5, quero que meu relatório de mapa tenha 5 pontos de alfinetes para a localização no mapa. Aqui está a consulta

A. [id] como StoreID, A.businessName como AgentName,

C. [descrição] as County, A.physicalAddressLatitude, A.physicalAddressLongitude,

Soma (OI.itemAmount) como OrderValue

INNER JOIN dbo.Store A em A. [id] = O. [storeID]

INNER JOIN dbo.Counties C em C. [id] = A.countyID

INNER JOIN dbo.OrderItems OI em OI.orderID = O. [id]

Onde O.orderDate & gt = '2013-01-01' e O.orderDate & lt = '2013-09-01'

Grupo por A. [id], A.businessName, C. [descrição], A.physicalAddressLatitude, A.physicalAddressLongitude

Ordem por soma (OI.itemAmount) DESC

aqui está o resultado da consulta

AgentID Nome do agente condado PhysicalAddressLatitude PhysicalAddressLongitude Valor do pedido
1001 Vendas de licença da Internet leon 30.44745 -84.2831 8804477
1002 Venda de licenças de telefone Leon 30.44745 -84.2831 1850246
1003 Wal Mart # 1874 Leon 26.93453 -82.3112 155814
1004 Meio Hitch Tackle Leon 30.16158 -85.7545 135972.5
1005 Wal Mart # 814 Leon 27.22664 -80.8323 125991.5

Existe uma ferramenta de terceiros que pode ser usada para ampliar os mapas de bing do SSRS. Preciso de uma barra que possa aumentar ou diminuir o zoom de um bing map, assim como o google maps.

atualizar ZipCodes SET SpatialData = 'POINT (' + convert (varchar (26), [Longitude]) + '' + convert (varchar (26), [Latitude]) + ')' de ZipCodes

. E verifique o resultado com:

selecione converter (varchar (8000), SpatialData) como SpatialData de ZipCodes

Ainda mais fácil: configure SpatialData como uma coluna computada (não persistente) e deixe o SQL fazer o trabalho:

[SpatialData] AS (CONVERT ([geografia], ((('POINT (' + CONVERT ([varchar], [Longitude], 0)) + '') + CONVERT ([varchar], [Latitude], 0)) + ')', 0))

Desculpas, remova a função ABS do meu post anterior, então vai funcionar

Para 'automatizar' a criação de dados espaciais em uma tabela maior, tente isso (o nome da minha tabela é tbl_mapdinvoices).

Eu preencho essa tabela (tbl_mapdinvoices) e na criação do conteúdo da tabela incluo uma coluna, 'rowid', que é um

Coluna IDENTITY (int, 1,1). Assim, quando a tabela é preenchida, o rowid é uma sequência de execução de: 1,2,3, etc.

Para preencher os valores de dados espaciais, tente isso.

enquanto @counter & lt (selecione MAX (rowid) +1 de tbl_mapdinvoices)

defina @lat = (selecione ABS ([num-lat]) de tbl_mapdinvoices onde rowid = @counter)

defina @lng = (selecione ABS ([num-lng]) de tbl_mapdinvoices onde rowid = @counter)

set @sql = 'update tbl_mapdinvoices set spatialdata =' + '' '' + 'POINT (' + (selecionar elenco (@lng como varchar (16))) + '' + (selecionar elenco (@lat como varchar (16) )) + ')' + '' ''

definir @sql = @ sql + 'onde rowid =' + (selecionar cast (@counter as nvarchar (10))) + ''


4.2. Consultas Espaciais

O razão de ser de bancos de dados espaciais é realizar consultas dentro do banco de dados, o que normalmente requer a funcionalidade GIS da área de trabalho. Usar o PostGIS de forma eficaz requer saber quais funções espaciais estão disponíveis, como usá-las em consultas e garantir que os índices apropriados estejam disponíveis para fornecer um bom desempenho.

4.2.1. Determinando Relações Espaciais

As relações espaciais indicam como duas geometrias interagem uma com a outra. Eles são uma capacidade fundamental para consultar a geometria.

4.2.1.1. Modelo de 9 Intersecções Dimensionalmente Estendido

De acordo com a Especificação de Implementação de Recursos Simples OpenGIS para SQL, "a abordagem básica para comparar duas geometrias é fazer testes de pares das interseções entre os Interiores, Limites e Exteriores das duas geometrias e classificar a relação entre as duas geometrias com base nas entradas da matriz de 'interseção' resultante. "

Na teoria da topologia de conjunto de pontos, os pontos em uma geometria embutida no espaço bidimensional são categorizados em três conjuntos:

O limite de uma geometria é o conjunto de geometrias da próxima dimensão inferior. Para PONTOS, que têm uma dimensão de 0, o limite é o conjunto vazio. O limite de um LINESTRING são os dois pontos de extremidade. Para POLYGON s, o limite é a linha dos anéis externos e internos.

O interior de uma geometria são os pontos de uma geometria que não estão no limite. Para POINT s, o interior é o próprio ponto. O interior de um LINESTRING é o conjunto de pontos entre os pontos de extremidade. Para POLYGON s, o interior é a superfície da área dentro do polígono.

O exterior de uma geometria é o resto do espaço no qual a geometria está embutida em outras palavras, todos os pontos que não estão no interior ou no limite da geometria. É uma superfície não fechada bidimensional.

O Modelo de 9 Intersecções Dimensionalmente Estendido (DE-9IM) descreve a relação espacial entre duas geometrias, especificando as dimensões das 9 interseções entre os conjuntos acima para cada geometria. As dimensões da interseção podem ser formalmente representadas em um formato 3x3 matriz de intersecção .

Para uma geometria g a Interior , Limite , e Exterior são denotados usando a notação I (g) , B (g) , e Por exemplo) . Também, dim (s) denota a dimensão de um conjunto s com o domínio de <0,1,2, F>:

Usando esta notação, a matriz de interseção para duas geometrias uma e b é:

Interior Limite Exterior
Interior escurecer (I (a) ∩ I (b)) dim (I (a) ∩ B (b)) dim (I (a) ∩ E (b))
Limite dim (B (a) ∩ I (b)) dim (B (a) ∩ B (b)) dim (B (a) ∩ E (b))
Exterior dim (E (a) ∩ I (b)) dim (E (a) ∩ B (b)) dim (E (a) ∩ E (b))

Visualmente, para duas geometrias poligonais sobrepostas, isso se parece com:

dim (I (a) ∩ I (b)) = 2

dim (I (a) ∩ B (b) = 1

dim (I (a) ∩ E (b)) = 2

dim (B (a) ∩ I (b)) = 1

dim (B (a) ∩ B (b)) = 0

dim (B (a) ∩ E (b)) = 1

dim (E (a) ∩ I (b)) = 2

dim (E (a) ∩ B (b)) = 1

dim (E (a) ∩ E (b) = 2

Lendo da esquerda para a direita e de cima para baixo, a matriz de interseção é representada como a string de texto ' 212101212 '.

Para obter mais informações, consulte:

4.2.1.2. Relacionamentos Espaciais Nomeados

Para facilitar a determinação de relações espaciais comuns, o OGC SFS define um conjunto de predicados de relacionamento espacial nomeados . PostGIS fornece estes como as funções ST_Contains, ST_Crosses, ST_Disjoint, ST_Equals, ST_Intersects, ST_Overlaps, ST_Touches, ST_Within. Ele também define os predicados de relacionamento não padrão ST_Covers, ST_CoveredBy e ST_ContainsProperly.

Predicados espaciais são geralmente usados ​​como condições nas cláusulas SQL WHERE ou JOIN. Os predicados espaciais nomeados usam automaticamente um índice espacial se houver um disponível, portanto, não há necessidade de usar o operador de caixa delimitadora & amp & amp também. Por exemplo:

Para mais detalhes e ilustrações, consulte o PostGIS Workshop.

4.2.1.3. Relações Espaciais Gerais

Em alguns casos, os relacionamentos espaciais nomeados são insuficientes para fornecer uma condição de filtro espacial desejada.

Por exemplo, considere um conjunto de dados linear que representa uma rede rodoviária. Pode ser necessário identificar todos os segmentos de estrada que se cruzam, não em um ponto, mas em uma linha (talvez para validar alguma regra de negócios). Nesse caso, ST_Crosses não fornece o filtro espacial necessário, pois para feições lineares ele retorna verdadeiro apenas onde elas se cruzam em um ponto.

Uma solução de duas etapas seria primeiro calcular a interseção real (ST_Intersection) de pares de linhas de estrada que se cruzam espacialmente (ST_Intersects) e, em seguida, verificar se o ST_GeometryType da interseção é 'LINESTRING' (lidando corretamente com casos que retornam GEOMETRYCOLLECTION s de [ MULTI] PONTOS, [MULTI] LINESTRING s, etc.).

Claramente, uma solução mais simples e rápida é desejável.

Um segundo exemplo é localizar cais que cruzam os limites de um lago em uma linha e onde uma das extremidades do cais está na costa. Em outras palavras, onde um cais está dentro, mas não completamente contido por um lago, cruza o limite de um lago em uma linha e onde exatamente um dos pontos finais do cais está dentro ou no limite do lago. É possível usar uma combinação de predicados espaciais para encontrar os recursos necessários:

. mas nem é preciso dizer que isso é bastante complicado.

Esses requisitos podem ser atendidos pelo cálculo da matriz de interseção DE-9IM completa. PostGIS fornece a função ST_Relate para fazer isso:

Para testar uma relação espacial específica, um padrão de matriz de interseção é usado. Esta é a representação da matriz aumentada com os símbolos adicionais :

A dimensão de interseção T = & gt não está vazia, ou seja, está em

Usando padrões de matriz de interseção, relações espaciais específicas podem ser avaliadas de uma forma mais sucinta. As funções ST_Relate e ST_RelateMatch podem ser usadas para testar padrões de matriz de interseção. Para o primeiro exemplo acima, o padrão de matriz de interseção especificando duas linhas que se cruzam em uma linha é ' 1*1***1** ':

Para o segundo exemplo, o padrão de matriz de interseção especificando uma linha parcialmente dentro e parcialmente fora de um polígono é ' 102101FF2 ':

4.2.2. Aproveitando os índices

Ao construir consultas usando condições espaciais, é importante garantir que um índice espacial seja usado, se houver (consulte a Seção 4.1.7, “Construindo Índices Espaciais”). Para fazer isso, um operador ou função espacial com reconhecimento de índice deve ser usado na cláusula WHERE ou ON. Os operadores espaciais incluem os operadores baseados em caixa delimitadora (dos quais o mais comumente usado é & amp & amp) e os operadores de distância usados ​​em consultas ao vizinho mais próximo (o mais comum sendo & lt- & gt.) Funções com reconhecimento de índice incluem a maioria dos predicados espaciais nomeados (como ST_Intersects) e a maioria dos predicados de distância (como ST_DWithin.)

Funções como ST_Distance não usam índices para otimizar sua operação. Por exemplo, a seguinte consulta seria bastante lenta em uma mesa grande:

Esta consulta seleciona todas as geometrias em geom_table que estão dentro de 100 unidades do ponto (100000, 200000). Vai ser lento porque está calculando a distância entre cada ponto da tabela e o ponto especificado, ou seja. um cálculo ST_Distance () é calculado para cada linha na tabela.

Podemos reduzir o número de linhas processadas usando a função sensível ao índice ST_DWithin:

Esta consulta seleciona as mesmas geometrias, mas o faz de forma mais eficiente. Isso é ativado por ST_DWithin () usando o operador & amp & amp internamente em uma caixa delimitadora expandida da geometria da consulta. Se houver um índice espacial no_geom, o planejador de consulta reconhecerá que pode usar o índice para reduzir o número de linhas varridas antes de calcular a distância. O índice espacial permite recuperar apenas registros com geometrias cujas caixas delimitadoras se sobrepõem à extensão expandida e, portanto, quais poderia estar dentro da distância exigida. A distância real é então calculada para confirmar se o registro deve ser incluído no conjunto de resultados.

4.2.3. Exemplos de SQL espacial

Os exemplos nesta seção farão uso de duas tabelas, uma tabela de estradas lineares e uma tabela de limites de municípios poligonais. As definições de tabela para a tabela bc_roads são:

A definição da tabela para a tabela bc_municipality é:

Qual é o comprimento total de todas as estradas, expresso em quilômetros?

Você pode responder a esta pergunta com uma parte muito simples de SQL:

Qual é o tamanho da cidade de Prince George, em hectares?

Esta consulta combina uma condição de atributo (no nome do município) com um cálculo espacial (da área):

Qual é o maior município da província, em área?

Esta consulta traz uma medição espacial para a condição de consulta. Existem várias maneiras de abordar este problema, mas a mais eficiente é a seguinte:

Observe que para responder a esta pergunta, temos que calcular a área de cada polígono. Se estivéssemos fazendo muito isso, faria sentido adicionar uma coluna de área à tabela que pudéssemos indexar separadamente para desempenho. Ordenando os resultados em uma direção descendente, e usando o comando "LIMIT" do PostgreSQL, podemos facilmente selecionar o maior valor sem usar uma função de agregação como max ().

Qual é a extensão das estradas totalmente contidas em cada município?

Este é um exemplo de uma "junção espacial", porque estamos reunindo dados de duas tabelas (fazendo uma junção), mas usando uma condição de interação espacial ("contida") como a condição de junção, em vez da abordagem relacional usual de junção em um chave comum:

Esta consulta demora um pouco, porque cada estrada na tabela é resumida no resultado final (cerca de 250K estradas para nossa tabela de exemplo particular). Para sobreposições menores (vários milhares de registros em várias centenas), a resposta pode ser muito rápida.

Crie uma nova tabela com todas as estradas da cidade de Prince George.

Este é um exemplo de "sobreposição", que pega em duas tabelas e gera uma nova tabela que consiste em resultantes recortadas ou cortadas espacialmente. Ao contrário da "junção espacial" demonstrada acima, esta consulta realmente cria novas geometrias. Uma sobreposição é como uma junção espacial turbo-carregada e é útil para um trabalho de análise mais exato:


Converter dados SqlGeometry de SQL diretamente para arquivo Tiles / PNG - Sistemas de Informação Geográfica

Este projeto já tem quase cinco anos. Huzzah! Ele também está lentamente desatualizado. Muitas das ideias nele ainda são relevantes, mas a tecnologia de blocos vetoriais melhorou significativamente desde que fiz este trabalho. Acho que o tutorial ainda é útil, mas esteja ciente de que existem opções mais modernas para as coisas. Por exemplo, eu usaria o formato vetorial de blocos do Mapbox para os blocos agora, não GeoJSON.

Além disso, o código pode ter apodrecido um pouco. O principal problema é que os URLs de download do NHD se tornam inválidos. É fácil atualizá-los (normalmente um incremento do número da versão). Solicitações de pull são bem-vindas.

Uma demonstração de bloco de vetores e tutorial

Este projeto contém tudo que você precisa do início ao fim para fazer um mapa da web baseado em vetor de rios americanos nos 48 estados contíguos. Este mapa de demonstração não é nem particularmente bonito nem complexo, mas é um exemplo completo de como construir um mapa da web usando dados vetoriais lado a lado em um mapa da web. O código-fonte é de código aberto e você é incentivado a ler e mexer com ele. O projeto tem três partes: preparação de dados, veiculação HTTP de blocos de vetores e clientes que renderizam mapas. Os componentes integrados neste projeto são:

    , os dados de origem para as linhas de fluxo do rio. , um banco de dados geográfico. , um servidor GeoJSON vetorial. , um contêiner de servidor da web Python. , Polymaps e D3.js, três bibliotecas Javascript para renderizar mapas.

São muitas peças, mas cada uma é bastante simples por si só. Combinados, eles formam uma poderosa pilha de mapeamento de código aberto para servir dados vetoriais a navegadores da web. Você é bem-vindo para ver o mapa rodando ao vivo no meu servidor, mas o verdadeiro objetivo deste projeto é mostrar aos desenvolvedores todas as peças necessárias para construir seus próprios mapas usando blocos vetoriais. Continue lendo para obter detalhes de como o mapa é construído e certifique-se de verificar o código-fonte com muitos comentários e foco na legibilidade. Existem também algumas notas de desenvolvimento muito detalhadas em meu diário de trabalho.

Para os autores do cliente, os blocos de vetor estão disponíveis como um serviço com o padrão de URL http://somebits.com:8001/rivers///.json. Uso leve apenas, o servidor não está provisionado para tráfego real.

  • Instale o software necessário.
  • Execute dataprep / downloadNhd.sh para baixar os dados para um diretório chamado "NHD".
  • Execute dataprep / importNhd.sh para trazer os dados NHD para um banco de dados PostGIS chamado "rivers".
  • Execute serve.sh de dentro do diretório do servidor para iniciar o TileStache no Gunicorn em http: // localhost: 8000 /.
  • Carregue um bloco de amostra no localhost para verificar se os blocos GeoJSON estão sendo servidos.
  • Execute clients / serverTest.py para fazer um teste rápido no servidor.
  • Carregue clients / rivers-leaflet.html, clients / rivers-polymaps.html, clients / rivers-d3.html ou clients / rivers-d3leaflet.html para visualizar o mapa.

Os blocos de vetor são uma ideia empolgante e subutilizada para fazer mapas eficientes. O Google Maps revolucionou a cartografia online com "mapas deslizantes", mapas raster que são um mosaico de imagens PNG ou JPG. Mas muitos dados geográficos são intrinsecamente orientados a vetores, linhas e polígonos. Hoje, muitos servidores de mapas renderizam dados vetoriais em imagens rasterizadas que são servidas aos clientes. Mas servir os dados vetoriais diretamente para o navegador do usuário para renderização no cliente pode tornar os mapas mais flexíveis e eficientes. Aplicativos móveis e serviços proprietários como o Google Maps estão começando a mudar para mapas vetoriais.

O mapeamento de vetores de código aberto ainda está nos estágios iniciais. Existem vários clientes de vetor de código aberto: Polymaps foi um dos pioneiros em mapas de navegador, MapsForge e OpenScienceMap são renderizadores para Android e MapBox 2 é baseado em uma pilha de blocos vetoriais. Existem poucos serviços de vetores de dados abertos, embora recentemente o OpenStreetMap tenha experimentado servir blocos de vetores. (Veja clientes experimentais como o de Ziggy Jonsson, o de Bobby Sudekum e o de Mike Bostock.) E atualmente há apenas alguns servidores de blocos de vetores de código aberto. Este tutorial depende do provedor VecTiles da TileStache para servir nossos geodados. A cerâmica é uma alternativa.

O agrupamento não é necessário para todos os dados vetoriais se o conjunto de dados completo for pequeno, é razoável servir uma geometria vetorial inteira como um único arquivo. Por exemplo, este tutorial mapeia incldues um arquivo de 88kb de contornos do estado dos EUA. Porém, com mais de 10 MB de geodados, é importante servir apenas à geometria visível, não a todo o conjunto de dados. Além disso, dimensionar os blocos para o nível de zoom atual permite a simplificação e a redução da amostra para a visibilidade de pixels. Mas o tiling requer muita preparação de dados e configuração do servidor, daí este tutorial.

Os blocos de vetor são bastante simples. Considere este bloco próximo a Oakland (cópia em cache em sample-13-1316-3169.json.txt). O sistema de nomenclatura de URL é a convenção do Google para blocos de mapas raster: esse bloco está em z = 13, x = 1316, y = 3169. Só que em vez de servir uma imagem PNG, o URL serve um arquivo GeoJSON que descreve a geometria dentro da caixa delimitadora do bloco. Este ladrilho de exemplo tem 3 recursos, um para o riacho San Lorenzo, um para o riacho Sulphur e um para dois outros fluxos não nomeados no ladrilho. Cada feição contém uma geometria, um nome, um código HUC que nomeia a bacia hidrográfica e um número de Strahler que caracteriza o significado do rio.

Uma coisa complicada sobre os tiles vetoriais é o que fazer com os recursos que cruzam os tiles. Neste tutorial, recortamos a geometria para o limite do ladrilho e contamos com as linhas sobrepostas sendo desenhadas para fazer um mapa contínuo. Também é possível não cortar, o que resulta em dados redundantes, mas mantém os recursos intactos.Uma terceira opção pode ser cortar a geometria e reuni-la novamente no cliente antes da renderização.

A seguir está uma lista parcial de software que você precisa instalar em seu sistema Unix para gerar e servir esses mapas. (Desculpe, usuários do Windows, Unix é a melhor escolha para este tipo de trabalho.) Eu testei com MacOS e Ubuntu. No Mac, a maioria dos pré-requisitos estão disponíveis via Homebrew, consulte também este guia para geo de código aberto no Mac. No Ubuntu, a maioria dos softwares está disponível via apt-get. Este código requer PostGIS 2 se você estiver executando algo anterior ao Ubuntu 14.04, você pode precisar do UbuntuGIS PPA. Veja abaixo as notas extras do Ubuntu. Outras distribuições Linux provavelmente podem instalar o software necessário por meio de seu sistema de pacote nativo. Se o código estiver disponível no PyPI, prefiro instalar o código Python com [pip] (http: //www.pip- installer.org/en/latest/) em vez de contar com as versões do pacote Mac ou Ubuntu.

  • Python 2. Eu prefiro Python 3, mas algumas das dependências não o suportam. para baixar dados NHDPlus da web. para descompactar dados NHDPlus. Os usuários do Ubuntu devem instalar o p7zip-full. e PostGIS para um banco de dados geoespacial. PostgreSQL 9.1 ou posterior e PostGIS 2 são recomendados para facilitar a instalação da extensão PostGIS. Este banco de dados é moderadamente grande, você pode querer ajustar as configurações do Postgres para usar mais memória. por falar com o Postgres do Python.
  • shp2pgsql, parte do PostGIS, para importar arquivos de forma ESRI para o PostGIS para importar bancos de dados DBF para o PostgreSQL. Observe que você precisa de pelo menos a versão 0.6.2 para o sinalizador -s. para um servidor de aplicativo da web Python. para o aplicativo da web Python que oferece blocos de mapas. TileStache tem uma dependência não documentada do Shapely que você pode instalar via pip. e grequests para serverTest.py, um teste de cliente HTTP Python. é a biblioteca de baixo nível para geo de código aberto.

Detalhes extras do Ubuntu 16.04

Não é um livro de receitas completo, mas feche:

Este projeto consiste em vários scripts curtos e arquivos de configuração para colar os componentes do software. Há pouca lógica de programação preciosa aqui, a maior parte dela é integração.

dataprep / downloadNhd.sh baixa dados de [NHDPlus] (http: //www.horizon- systems.com/nhdplus/), um bom repositório de dados hidrográficos nacionais limpos e distribuídos como arquivos de forma ESRI. Este script de shell se encarrega de baixar os arquivos e, em seguida, extrair os arquivos de dados específicos nos quais estamos interessados. NHDPlus é um recurso fantástico se você estiver interessado em mapear a água nos Estados Unidos. Observe que, por padrão, o script só baixa dados para editar o script na Califórnia, se você quiser os EUA inteiros.

dataprep / importNhd.sh importa os dados NHDPlus para PostGIS e os prepara para servir. Este script pega idéias do importador NHD de Seth Fitzsimmons. Observe que a saída detalhada é registrada em um arquivo denominado /tmp/nhd.log.*, consulte a primeira linha da saída do script para obter detalhes. As etapas desse script são:

    Crie um banco de dados chamado rivers

dataprep / processNhd.sql prepara os dados importados em um formato mais adequado às nossas necessidades. Ele cria uma nova tabela chamada rivers que une a geometria de NHDFlowline com metadados como nome do rio, código de alcance e número de Strahler de PlusFlowlineVAA. Tem cerca de 2,7 milhões de linhas para todos os EUA. (NHDFlowline tem quase 3 milhões de linhas de fluxo de linhas que não têm comid em PlusFlowlineVAA são descartadas.)

dataprep / mergeRivers.py otimiza os dados mesclando a geometria. Os dados do NHD têm muitas pequenas linhas para um único rio. Para eficiência, mesclamos geometrias com base no ID do rio e a parte HUC8 do código de alcance. A tabela merged_rivers resultante tem cerca de 330.000 linhas. Esta etapa é complexa e não estritamente necessária - TileStache pode servir a geometria na tabela de rios diretamente. Mas o GeoJSON resultante é grande e lento para renderizar a fusão de cada rio em uma única LineString ou MultiLineString resulta em blocos de vetor com aproximadamente um décimo do tamanho e do tempo de processamento.

server / serve.sh é um script de shell simples para invocar o Gunicorn e o webapp TileStache e disponibilizá-lo em http: // localhost: 8000 /. Em uma implantação de produção real, isso deve ser substituído por uma estrutura de gerenciamento de servidor. (Também é possível servir o TileStache via CGI, mas é terrivelmente lento.)

server / gunicorn.cfg.py é a configuração do servidor Gunicorn. Há muito pouco aqui neste exemplo, o Gunicorn tem muitas opções de configuração.

server / tilestache.cfg configura o TileStache para servir uma única camada chamada rivers da tabela merged_rivers, apoiada por um cache em / tmp / stache. Ele usa o provedor VecTiles, a mágica do TileStache que cuida de fazer consultas PostGIS e preparar blocos GeoJSON bem cortados. Nesta camada, começamos a tomar decisões cartográficas significativas.

clients / serverTest.py é um teste de cliente Python simples que inspeciona alguns blocos de vetores para correção básica e relata os tempos de carregamento. clients / slowTiles.py é outro cliente de teste simples para cronometrar alguns blocos particularmente lentos para o maior conjunto de dados dos EUA.

clients / rivers-leaflet.html, clients / rivers-polymaps.html, clients / rivers-d3.html e clients / rivers-d3leaflet.html são quatro implementações diferentes de renderizadores de mapa Javascript. Cada um deles carrega blocos de vetores de URLs como http: // localhost: 8000 / rivers ///.json e renderizá-los como SVG. A maioria das versões também carrega algumas outras camadas de mapa para contexto: um mapa de relevo sombreado do ESRI e contornos vetoriais dos estados dos EUA.

As diferenças entre esses clientes são quais bibliotecas Javascript são usadas para implementar o mapa. Leaflet é uma biblioteca de mapas Javascript excelente mantida ativamente, rivers-leaflet, que usa suporte de vetor a partir do plugin leaflet-tilelayer-geojson de Glen Robertson, enquanto rivers-d3leaflet usa um híbrido Leaflet / D3 que é rápido, mas não completo. Polymaps é uma biblioteca de mapas Javascript mais antiga que não é mais mantida ativamente. A Polymaps foi a pioneira na ideia de blocos vetoriais e renderiza mapas vetoriais com muita eficiência. D3.js é um kit de ferramentas de visualização com fortes recursos de dados geográficos. A implementação do D3 é mais uma demonstração do que um mapa completo e é muito emprestada de um exemplo de Mike Bostock.

A maior parte do trabalho neste projeto é encanamento, programação de sistemas que temos que fazer para fazer os motores funcionarem. O mapa de demonstração é deliberadamente bastante simples e pouco sofisticado. Mesmo assim, contém algumas decisões que requerem a arte do cartógrafo.

A maior parte da cartografia real está sendo feita em Javascript, nos scripts de desenho de Folheto e Polymaps. O código deste tutorial faz muito pouco, principalmente apenas desenha linhas azuis em espessuras variadas. Além disso, a versão do folheto tem um pop-up simples quando os rios são clicados. Com a geometria vetorial real e metadados disponíveis em Javascript, muito mais poderia ser feito na apresentação, destacando rios, filtragem interativa por número de Strahler, combinação com outras fontes de dados vetoriais, etc.

Todos os clientes de mapas apresentados aqui usam a projeção do Google Mercator, como é padrão para mapas da web. Mas, como os dados do rio são orientados por vetores, é possível projetá-los de outras maneiras. Por exemplo, consulte o mapa dos rios Albers de Jason Davies.

Algumas decisões cartográficas são feitas no lado do servidor. A configuração TileStache VecTiles contém uma matriz de consultas que retornam resultados em diferentes níveis de zoom. Em altos níveis de zoom (digamos z = 4), retornamos apenas rios que são relativamente grandes, aqueles com um número de Strahler de 6 ou superior. Em níveis de zoom mais precisos, retornamos mais rios e menores. Essa filtragem por zoom limita a largura de banda usada em mapas de grande escala e evita que a exibição fique sobrecarregada. Renderizar zilhões de pequenos fluxos pode ser muito bonito, mas também exige muitos recursos.

VecTiles também simplifica a geometria, servindo apenas a precisão necessária no nível de zoom. Você pode ver isso em ação se observar a re-renderização conforme você navega pelos rios, que começará a crescer mais curvas e detalhes conforme você aumenta o zoom. O TileStache faz isso para nós automaticamente.

O mapa fornecido aqui é uma demonstração tutorial simples. Para tornar este mapa melhor, algumas direções possíveis:

Mais bela renderização do rio. Os rios aqui são desenhados como linhas azuis simples com uma espessura baseada no nível de zoom e no número de Strahler do rio, uma medida topológica de sua distância das cabeceiras. O mapa poderia ser mais bonito também variando a cor do rio ou trazendo informações extras sobre o tamanho do rio, como vazão ou largura média do canal. Veja este mapa do Pacific Institute para um exemplo usando estimativas de fluxo da tabela EROM_MA0001 do NHD.

Mais dados temáticos. Os blocos de relevo do ESRI são um bom mapa básico porque mostram a relação natural entre o terreno e o fluxo do rio, mas são mínimos. Por que não adicionar algumas lagoas e lagos, ou colorir a cobertura do solo, ou cidades e estradas principais?

Use um servidor HTTP melhor. O Gunicorn foi projetado para ser executado por trás de um proxy como Nginx ou Apache. Um proxy não apenas lida melhor com clientes lentos, mas pode servir cabeçalhos de cache apropriados e fazer gzip da saída JSON. O arquivo server / nginx-rivers.conf é como os tiles são servidos no servidor live.

Telhas de vetor mais eficientes. O código aqui baixa um novo conjunto de blocos para cada nível de zoom. Mas isso é desnecessariamente redundante, é viável fazer download de novos blocos apenas a cada poucos níveis de zoom e trocar a precisão de pixel perfeita por largura de banda menor.

Converta para TopoJSON para codificação menor. Mesmo sem a topologia compartilhada, a codificação TopoJSON pode ser significativamente menor do que o GeoJSON equivalente. Veja os experimentos de Mike Bostock convertendo toda a rede fluvial em um arquivo TopoJSON gigante.

Meça e melhore o tempo de renderização do cliente. A versão D3 do cliente mostra que a renderização pode acontecer muito rápido. Infelizmente, a renderização GeoJSON do Leaflet é muito lenta e Polymaps em algum lugar no meio. Algum tempo de qualidade com as Ferramentas de desenvolvedor do Chrome pode ajudar a descobrir onde otimizar o folheto, ou talvez a biblioteca lib / TileLayer.d3_geoJSON.js possa ser estendida para oferecer suporte a todos os recursos de uma camada de bloco do folheto.

Clientes WebGL ou Canvas. Todos os três clientes Javascript neste tutorial são renderizados via SVG. Essa é uma escolha natural para dados vetoriais, mas pode ser lenta, principalmente em navegadores móveis. WebGL é uma opção muito interessante, veja os experimentos de Migurski com WebGL e mapas vetoriais.

Projeções alternativas. O mercator esférico que usamos para mapas da web é um compromisso razoável, mas outras projeções podem ser interessantes. Veja o mapa dos rios Albers de Jason Davies, a reprojeção do raster de tela de Jason e a reprojeção de raster WebGL de Mike Bostock.

Estenda a cobertura de dados para o Alasca, Havaí e outros países. Natural Earth é um bom lugar para começar. Ele também possui links para outras fontes, como o CCM2 da Europa. A Austrália também tem dados!


Assista o vídeo: Spatial Datatypes in SQL Server