Página 1 de 1
Ponto no Polígono (Mapa)
Enviado: 04 Ago 2020 às 17:56
por WolfShadow
Senhores,
Tenho uma planilha que testa (via VBA) se um ponto esta dentro dos vértices de um polígono.
Preciso replicar esta solução no Power Bi, pela experiência que tenho no Excel, imagino que a solução deva ser em Power Query (Linguagem M) pela necessidade de performance e estrutura da base de dados....
O arquivo esta anexo neste post (e em caso de problemas também coloquei na pasta compartilhada no link abaixo):
https://drive.google.com/drive/folders/ ... sp=sharing
O arquivo tem 3 planilhas:
- Lat Long - que é o arquivo com um exemplo simples
- Base Polígonos - que são alguns polígonos que usamos para a cidade de São Paulo
- Base de Pontos (Fake) - que tem um conjunto pequeno de pontos fake sem nome definido para não expor os dados da empresa.. nele tem basicamente:
- Colunas A até E nomenclatura de pontos e coordenadas
- Colunas F até EH aplicação das formulas e do VBA (que pensei em ser o item a ser traduzido para o M)
- Colunas EI e EJ resultado esperado
Imaginei que no Power Query a solução seria colocar a "Base Polígonos" como uma consulta onde a função consultaria os pontos da mesma forma que no Excel em anexo numa segunda consulta, com isso temos a saída das colunas de F até EH e dai uma formula condicional para chegar nas colinas EI e EJ
Não sei se o formato fica bom no Power Query.... por isso sintam-se a vontade para sugerir outras formas de viabilizar o resultado.
Obrigado por toda ajuda que possa dar
Ponto no Polígono (Mapa)
Enviado: 10 Ago 2020 às 18:15
por Branquinho
Olá WolfShadow! Vc já montou um teste lógico para comparar as coordenadas do ponto com as dos vértices do polígono?
Ponto no Polígono (Mapa)
Enviado: 10 Ago 2020 às 20:58
por WolfShadow
Isso mesmo a função em vba testa cada vertice e cria uma angulação e verifica se o ponto de teste esta la dentro.... O Cod em VBA é uma aplicação em excel, mas a ideia é fazer no power Query (por questões de performance)
Ponto no Polígono (Mapa)
Enviado: 10 Ago 2020 às 22:18
por Branquinho
Onde estão os polígonos na forma representada na planilha Lat Long? Não os vi na planilha Base Polígonos porque me pareceram pontos desagrupados.
Ponto no Polígono (Mapa)
Enviado: 11 Ago 2020 às 09:37
por WolfShadow
Na planilha estão listados apenas os vértices dos polígonos que basicamente são uma lista de longitude, latitude e titulo do polígono que na planilha é o desejado na resposta conforme apresentado no arquivo de exemplo que carreguei na primeira pergunta deste post...
Coloquei no google drive um arquivo KML com os polígonos (se abrir em um notepad, vc poderá ver que os vértices são os mesmos do arquivo excel mas limpo dos códigos) e ele apresenta os polígonos em si...
OBS: tentei colocar o arquivo anexo nesta resposta mas não consegui
----
No excel uso o seguinte VBA para identificar de o ponto em questão esta contido no polígono:
Option Explicit
Const dPi = 3.14159265358979
Function PointInside(rPoint As Range, rTable As Range) As Boolean
Dim vAngles, iPoints As Integer, i As Integer
Dim dAngle As Double, dTotal As Double
'Calculates the angles 0 - 2*Pi
iPoints = rTable.Rows.Count
ReDim vAngles(1 To iPoints)
For i = 1 To iPoints
If (rTable(i, 1) = rPoint(1)) Then
dAngle = IIf(rTable(i, 2) >= 0, 1, -1) * dPi
Else
dAngle = Atn((rTable(i, 2) - rPoint(2)) / (rTable(i, 1) - rPoint(1))) + IIf(rTable(i, 1) - rPoint(1) < 0, dPi, 0)
dAngle = dAngle + IIf(dAngle < 0, 2 * dPi, 0)
End If
vAngles(i) = dAngle
Next i
' Adds the differences
For i = 1 To iPoints - 1
dAngle = vAngles(i + 1) - vAngles(i) + IIf(vAngles(i + 1) < vAngles(i), 2 * dPi, 0)
dTotal = dTotal + dAngle - IIf(dAngle > dPi, 2 * dPi, 0)
Next i
PointInside = Abs(dTotal) > dPi
End Function
Essa é a função a ser traduzida no M (que já arranquei o restante dos cabelos e ainda nao consegui)
Ponto no Polígono (Mapa)
Enviado: 11 Ago 2020 às 10:33
por Branquinho
Vou citar um exemplo da minha dúvida. Qual é o polígono pra verificar se o ponto 10 está lá dentro?
Ponto no Polígono (Mapa)
Enviado: 11 Ago 2020 às 11:47
por WolfShadow
Agora entendi a sua dúvida.... na verdade em excel acabo testando todos e a consulta fica muito lenta, mas não vi outro jeito na epoca, já como a ideia é migrar para o PBI imagino em ter esta função no Power Query da seguinte forma:
- testa se o ponto esta inserido em SP Capital
Falso: testa e retorna o nome da cidade (outros polígonos que não estão neste exemplo para não ficar pesado)
Verdadeiro: Testa e retorna o nome do polígono (que neste caso é o distrito administrativo - o conjunto de bairros da cidade)
no final das contas tinha pensado em termos de linguagem de programação em fazer um loop que quando desse verdadeiro ele sai do loop com a informação de qual poligono o ponto se refere assim ele não testa todos como no excel e fica mais agil. O meu problema é traduzir a formula usada no VBA para o Power Query, espero ter conseguido me explicar melhor. E desde já agradeço a sua atenção
Ponto no Polígono (Mapa)
Enviado: 11 Ago 2020 às 16:04
por Branquinho
Por que as colunas "Local" e "Divisão" se repetem na planilha Base Polígonos?
Ponto no Polígono (Mapa)
Enviado: 11 Ago 2020 às 17:43
por WolfShadow
Na verdade essa planilha foi gerada a alguns anos e na época como não tinha noção de power query e power pivot e fui aprendendo com o tempo, esses campos não foram separados para uma tabela a parte para evitar repetições.... em outras palavras, foi pura falta de conhecimento na época, e como esta rodando foi ficando....
O bom que o momento de mudar é agora... saindo para o Power Bi já muda o processo e tem a possibilidade de melhorar
Ponto no Polígono (Mapa)
Enviado: 12 Ago 2020 às 16:35
por Branquinho
Pensei bastante sobre o caso. Por enquanto, não consegui resolver essa questão. Aliás, ainda tem a possibilidade de um ponto estar localizado em vários polígonos.
Ponto no Polígono (Mapa)
Enviado: 12 Ago 2020 às 19:35
por WolfShadow
Eu entendo.... por isso travei minha solução... Desde já agradeço sua atenção....
Na verdade o único caso do ponto estar dentro de mais de um polígono é no caso de São Paulo, que caso ele esteja em SP ele entra nos poligonos individuais e não tem como ele estar mais de um....