# QGIS - Helpers [toc] ## Escalas Graus => Metros |Graus|metros|km| |:-:|:-:|:-:| |1|100.000|100| |0.1|10.000|10| |0.01|1.000|1| |0.001|100|0.100| |0.0001|10|0.010| :::info Aqui penso que o mais correto seria partirmos de um SRID com suporte a medicoes em metros mas ainda nao fui feliz na busca. ### TABELA COM SRIDs |SRID|UNIDADE|NOME|OBSERVACAO|| |:-:|:-:|:-:|:-:|:-:| |4988| metros |SIRGAS 2000 |-|https://epsg.io/4988| |4674| graus |SIRGAS 2000 |-|https://epsg.io/4674| |4326| graus |WGS 84 |-|https://epsg.io/4326| |4328| graus |WGS 84 |DEPRECATED|https://epsg.io/4328| |31982| metros |SIRGAS_2000 UTM_zone_22S |indicacao GPT|https://epsg.io/31982| |31983| metros |SIRGAS_2000 UTM_zone_23S |indicacao GPT|https://epsg.io/31983| |31984| metros |SIRGAS_2000 UTM_zone_24S |indicacao GPT|https://epsg.io/31984| ::: ## Rotas Massivas com Valhalla processo para geração de rotas massivas: podemos carregar 2 CSVs contendo LABEL;LAT;LONG e entao cruza-los podemos ainda... dada uma lista de pontos: e dada uma camada de fribras conhecidas... 1- linha mais curta entre feicoes 2- extrair vertices especificos (0(primeiro ponto) e -1(ultimo ponto)) 3- usar valhalla para gerar rotas entre estes 2 pontos; - no valhalla utilizamos a opcao 'pedestrian - directions from points to layers' ## Comandos Uteis no Qgis ### Extrair por localização ![image](https://hackmd.io/_uploads/Bkb_9s4BT.png) ### Extrair por atributo ![image](https://hackmd.io/_uploads/Sy35coVra.png) ### Extrair por expressao ![image](https://hackmd.io/_uploads/H1KnqsVH6.png) ### soma comprimento de linha ### Diferença ### Ajustar geometrias a camada dado um ponto solto, podemos move-lo para cima de uma linha definindo uma distancia limite para este ajuste ### linha mais curta entre feicoes utilizamos este para dada uma lista de ponto, encontrar o ponto de toque mais proximo a uma outra camada ### extrair vertices utilizamos este apos gerar a linha mais curta entre feicoes extraindo vertice 0 temos ponto inicial e isso gera uma camada com os resultados extraindo vertice -1 temos ponto final e isso gera uma camada com os resultados ### Valhalla - Directions From Points 2 Layers utilizamos este em conjunto com as 2 camadas de vertices extraidas. com isso geramos de forma massiva a geracao de rotas rodoviarias. ### Caminho mais curto (ponto para ponto) Esta função gera a rota mais curta sobre as geometrias de uma camada com a possibilidade de se incluir uma TOLERANCIA DA TOPOLOGIA para ignorar falhas no cadastro. --- ### Agrupamento de pontos por Distancia Quando processado adiciona parametros CLUSTER_ID e CLUSTER_SIZE na camada alvo. Agrupamento por distancia, lembrando que valor dem Graus entao deve-se dividir por 111 para em Kms. ![image](https://hackmd.io/_uploads/rylpLW3Yp.png) exemplo para cluster de 25Km ![image](https://hackmd.io/_uploads/By_9v-nKa.png) ### Agrupamento de pontos por limite de grupos Quando processado adiciona parametros CLUSTER_ID e CLUSTER_SIZE na camada alvo ![image](https://hackmd.io/_uploads/BJICIZhYp.png) exemplo para cluster de 25 agrupamentos para pontos clientes ![image](https://hackmd.io/_uploads/HyF6vZ2tp.png) # POC - SISTEMA ELETRICO baixamos do https://gisepeprd2.epe.gov.br/WebMapEPE/ as camadas: - sistema eletrico existente - subestacoes - base existente - linhas de transmissao - base existente vamos camar as SubEstacoes de SE e as Linhas de Transmissao de LT; ![](https://hackmd.io/_uploads/S1Oaq8MBn.png) analisando as nossas 2 camadas, temos que as LTs NAO se conectam as SEs. ## solucao usando buffer para as SE, usamos a funcao "buffer" com distancia de 0.0035 que representa algo PROXIMO a 350mts ![](https://hackmd.io/_uploads/r1a7iUfB3.png) analisando resultado agora temos a camada buffer cobrindo todas as terminacoes de LT. ## solucao usando linha mais curta entre feicoes tentamos utilizar a funcao "linha mais curta entre feicoes" para solucionar o problema usamos como camada de origem as LT... e como camada destino as SE ![](https://hackmd.io/_uploads/rkjsn8fB2.png) apesar de na teoria resolver, na pratica, por algum motivo ela nao processou todas as LTs ### extrair vertices especificos. vamos tentar resolver o problema anterior extraindo as 2 extremidades de cada LT, nestes pontos daí processamos a linha mais curta. criamos vertice_0 com a funcao "extrair vertices especificos" na camada de entreada LT e usando indice de vertice 0 criamos vertice_-1 com a funcao "extrair vertices especificos" na camada de entreada LT e usando indice de vertice -1 criamos "linha mais curta 0" usando funcao "linha mais curta entre feicoes" usando camada origem vertice_0 camada destino SE; criamos "linha mais curta -1" usando funcao "linha mais curta entre feicoes" usando camada origem vertice_-1 camada destino SE; :::danger limitamos a distancia em "0,005" pois estavamos conectando pontos muito distantes de nosso interesse. ::: ![](https://hackmd.io/_uploads/rkZ3bwfB2.png) agora resultado ficou perfeito! ## mesclando linhas novas com LTs usando a funcao "mesclar camadas vetoriais" mesclamos as nossas linhas de conexao com a camada LT ![](https://hackmd.io/_uploads/rkN5zDfr2.png) ## Gerando rotas sobre as LTs vamos carregar no banco nossa camada de LTs, para isso utilizamos o QGIS para facilitar o processo. depois vamos preparar para suporte ao PGR_DIJSKTRA ```sql= -- criando colunas source target e cost ALTER TABLE public.poc_linhas_de_transmissao_eletrica ADD COLUMN "source" integer; ALTER TABLE public.poc_linhas_de_transmissao_eletrica ADD COLUMN "target" integer; ALTER TABLE public.poc_linhas_de_transmissao_eletrica ADD COLUMN cost double precision; -- criando indices CREATE INDEX floripa_fibras_tratadas_source_idx ON floripa_fibras_tratadas (source); CREATE INDEX floripa_fibras_tratadas_target_idx ON floripa_fibras_tratadas (target); -- populando source e target SELECT pgr_createTopology('poc_linhas_de_transmissao_eletrica', 0.001, 'geom', 'id'); -- populando custos UPDATE public.poc_linhas_de_transmissao_eletrica SET cost = ST_Length(geom); -- CONSULTA SIMPLES GERANDO ROTA SELECT * FROM pgr_Dijkstra( 'SELECT id, source, target, cost FROM poc_linhas_de_transmissao_eletrica', 2,-- ID ORIGEM 1530, -- ID DESTINO FALSE ); -- CONSULTA TRAZENDO DETALHES DAS GEOMETRIAS SELECT * FROM pgr_Dijkstra( 'SELECT id, source, target, cost FROM poc_linhas_de_transmissao_eletrica', 2,-- ID ORIGEM 1530, -- ID DESTINO FALSE ) AS di JOIN poc_linhas_de_transmissao_eletrica AS pt ON di.edge = pt.id ``` ::: ### consulta para dados 2 nodes, gerar GeoJSON com trecho ```sql SELECT json_build_object( 'type', 'FeatureCollection', 'features', json_agg( json_build_object( 'type', 'Feature', 'geometry', ST_AsGeoJSON(ST_Transform(di.geom, 4326))::json, 'properties', json_build_object( 'id', di.id, 'source', di.source, 'target', di.target, 'teste', di."Nome" ) ) ) ) AS geojson FROM ( SELECT * FROM pgr_dijkstra( 'SELECT id, source, target, cost FROM poc_linhas_de_transmissao_eletrica', 2, 1530, FALSE ) AS dij JOIN poc_linhas_de_transmissao_eletrica AS pt ON dij.edge = pt.id ) AS di; ``` ![](https://hackmd.io/_uploads/ByFjkYXB3.png) ### transformando geometria 3d em 2d ```sql ALTER TABLE public.last_artur_com_conexoes ALTER COLUMN geom TYPE geometry(MULTILINESTRING, 4326) USING ST_Force2D(geom); ``` # Terminologias PgRouting ![](https://hackmd.io/_uploads/SJiVaY-F2.png)