Mais

Criando modelo geodjango com campo de geometria que pode aceitar diferentes projeções

Criando modelo geodjango com campo de geometria que pode aceitar diferentes projeções


Estou trabalhando em um aplicativo da web com GeoDjango e dentro do modelo (tabela db) RoadAxis Eu tenho campo de geometria ou mais precisamente LineStringField onde preciso armazenar diferentes polilinhas (eixo da estrada) para diferentes projetos (cada polilinha tem FK para ID do projeto). O problema é que os projetos serão feitos em sistemas de coordenadas diferentes (não posso saber com antecedência), então as polilinhas que terei de armazenar também terão sistemas de coordenadas diferentes. Eu sei que no banco de dados PostGIS eu posso ter colunas de geometria com linhas em diferentes projeções, mas quando eu defino meu modelo Geodjango eu preciso definir SRID único para todos eles, ou ele pega 4326 por padrão.

Existem poucas opções que considerei, mas nenhuma delas resolveu realmente o meu problema. Vou tentar passar por alguns deles e espero que alguns de vocês possam me dizer se eu entendi algo errado ou se há alguma ideia muito melhor

1) transformar os dados antes de salvar em um único sistema de coordenadas (por exemplo, WGS84)

Problema com esta abordagem: Eu não posso simplesmente transformar minhas geometrias antes de salvá-las no banco de dados usando funções integradas do geodjango porque eu perderia a precisão do levantamento que preciso para alguns cálculos posteriores.

2) Crie dinamicamente uma nova tabela no tempo de execução. Idéia: Primeiro, ter apenas uma tabela onde as geometrias seriam armazenadas e todas em um sistema de projeção (por exemplo, wgs84) e, em seguida, quando o novo projeto for adicionado - se tiver sistema de coordenadas diferente, eu dinamicamente crio uma nova tabela com o campo geom para esse sistema de projeção e, em seguida, armazeno os dados desse projeto nessa nova tabela

Problema: criar tabelas dinamicamente no django não parece a solução mais feliz e fácil, e pode causar muitos problemas adicionais mais tarde.

3) Usando noSQL db, então ao invés de criar dinamicamente novas tabelas no banco de dados relacional eu poderia usar algo como MongoDB e orientá-lo a documentos Problema: isso adiciona mais complexidade à aplicação e provavelmente não é realmente necessário, além de perder as possibilidades que tenho com PostGIS ( consultas espaciais, funções de transformação eventual, ...)

4) criar um campo de geometria com alguns epsg falsos e colocar todas as geometrias nele mesmo que tenham projeções diferentes e, em seguida, criar um campo adicional onde eu salvaria uma série real de geometria ... Problema: não é uma solução realmente correta e limpa, mas pode ajudar neste trabalho

5) ?

Talvez eu esteja apenas perdendo algo óbvio, mas realmente não tenho uma ideia clara de qual é a melhor maneira de fazer isso.


Não tenho certeza se sua preocupação em 1) é justificada. Se não me engano, o GeoDjango armazena as coordenadas como um float e em Python tem uma precisão de 16 dígitos, que provavelmente é mais precisa do que a maioria dos dados espaciais observados.

Por exemplo, para armazenar uma coordenada de longitude em WGS84, você tem valores entre -180 e 180. Isso leva três dígitos antes da vírgula e deixa 13 dígitos depois da vírgula.

Se assumirmos uma circunferência do equador de 40.000km, um grau representa cerca de 111km por grau no equador:

40.000 km / 360 graus = 111 km / graus

Isso nos deixaria com uma precisão de

111 * 10 ^ 3 m / 10 ^ 13 = 1,11 * 10 ^ -8 m ~ = 10 nm

Portanto, a precisão numérica de uma coordenada de longitude em WGS84 armazenada como um flutuador duplo fornece uma precisão de 10 nanômetros!

Agora, para cálculos espaciais como distância e área, o uso do WGS84 realmente produzirá resultados errados, então você pode considerar armazenar o srid original em um campo inteiro separado e projetar seus dados de volta na projeção original ao realizar cálculos. Isso deixa você com o problema de organizar seu código, mas você pode armazenar com segurança todos os dados em uma projeção. A perda de precisão numérica da reprojeção é provavelmente insignificante.


Um GeoDjango MultiPolygonField deve aceitar uma geometria de polígono?

Quando tento definir um polígono em um MultiPolygonField, a seguinte exceção é levantada:

Isso seria compreensível, exceto que uma nota no tutorial GeoDjango afirma:

. um GeoDjango MultiPolygonField aceitará uma geometria de polígono.

Dei uma olhada na origem do proxy.py e ele está verificando se o valor (um polígono) é uma instância da classe de geometria relevante (um MultiPolygon). Tentei fazer essa verificação manualmente, o que confirma que um polígono não herda de MultiPolygon:

Isso chamou minha atenção ao tentar simplificar um valor MultiPolygon armazenado existente. Abaixo está meu modelo:

O processo que usei para simplificar o MultiPolygon está abaixo. A última linha faz com que a exceção seja levantada:

Se eu usar o polígono para criar um MultiPolygon, ele funcionará bem:

A nota do tutorial é enganosa ou estou fazendo algo errado?

EDIT: Testes adicionais nas geometrias.

O MultiPolygon original direto do campo do modelo:

Aplicando o método simplify ():

Criando um MultiPolygon a partir da geometria simplificada:

Observe que o MultiPolygon acima não tem SRID. Achei que talvez fosse esse o motivo de estar sendo aceito. Eu criei um com o argumento srid = 4326, mas também foi aceito pelo campo.

Aqui está um exemplo realmente básico do problema:


Conversão entre sistemas de coordenadas esféricas

Digamos que eu tenha as coordenadas esféricas de alguns locais, especificamente sua longitude ($ a 360) e latitude (latitude = $ no equador, $ 90 $ no pólo norte, $ -90 $ no pólo sul) em uma esfera com um raio de $ 1 $ . Se eu quisesse converter para um sistema de coordenadas diferente, tratando o ponto no equador original na longitude original de $ X $ (procurando generalização aqui) como o pólo norte de uma nova longitude / latitude, qualquer ideia de quais fórmulas eu precisaria aplicar para converter as coordenadas originais?

(Se você estiver interessado, este problema surge quando tento representar graficamente a saída de previsões de um modelo estatístico para um fenômeno esférico. Meu aplicativo gráfico pode facilmente criar uma projeção 2D de cima para baixo com dados de latitude / longitude, mas também gosto de criar projeções centradas em pontos de longitude arbitrários ao longo do equador, então pensei que a rota mais fácil seria tratar a vista lateral como um novo sistema de coordenadas de latitude / longitude.)


Copyright: Este é um artigo de acesso aberto distribuído sob a Licença de Atribuição Creative Commons que permite o uso irrestrito, distribuição e reprodução em qualquer meio, desde que o trabalho original seja devidamente citado.

Encorajamos comentários e feedback de uma ampla gama de leitores. Veja os critérios para comentários e nossa declaração de diversidade.

O que é isso?

Adicione um registro desta revisão ao Publons para rastrear e mostrar sua experiência em revisão em jornais do mundo todo.


3 respostas 3

Isenção de responsabilidade: não é um especialista

  1. O único dos quatro armazenados como uma imagem "plana" 2D é o Vista Projetada. Essa é a renderização real do modelo 3D em uma certa projeção em um plano, que é apenas uma imagem normal (2D).
  2. Os formatos de arquivo reais podem ser um pouco complicados e incluem coisas como algoritmos de compressão e metadados. Para mantê-lo mais limpo, irei abordar apenas a ideia geral por trás das abordagens.
    • Nuvem você armazenaria uma lista de coordenadas de (tantos quanto possível) pontos na superfície do seu objeto. Quanto mais pontos você armazena, mais detalhes você retém.
    • Malha, como você disse, é uma lista de polígonos, então você armazenaria uma lista de pontos (vértices do polígono) e, em seguida, uma lista de listas definindo quais pontos formam um polígono juntos. Exemplo de um objeto de cubo (polígonos são os lados quadrados)
      • vértices como tuplas de coordenadas: 1: (0,0,0), 2: (1,0,0), 3: (0,1,0), 4: (1,1,0), 5: (0 , 0,1), 6:
        (1,0,1), 7: (0,1,1), 8: (1,1,1),
      • e então os polígonos como listas de vértices: [1,2,4,3], [5,6,8,7], [1,2,6,5], [3,4,8,7], [ 1,5,8,4], [2,6,7,3]
    • volumétrico Eu não estou falando sobre este, eu acho que eles podem estar se referindo a voxels. Voxels são como pixels, mas 3D, então você deve dividir seu espaço em pequenos cubos e então anotar as coordenadas de cada um dos cubos que são preenchidos pelo objeto que você tenta representar (possivelmente incluindo cor, opacidade, material.). Novamente, voxels (cubos) menores ou maiores fornecem mais ou menos detalhes (assim como menos pixels mostram imagens de qualidade inferior).
    • Vista projetada Veja acima. Essa é apenas uma imagem normal. Você pode ter muitas projeções / renderizações / imagens diferentes de um modelo 3D. Geralmente, você não pode criar o modelo 3D original, se tudo o que você tem é uma projeção dele.
  3. Veja acima um pequeno exemplo (mal formatado). Observe que existem outras maneiras de realizar a mesma coisa.
  4. Novamente, veja acima. Na verdade, eles são bastante semelhantes, mas a abordagem da nuvem de pontos não começa com uma grade regular. Você apenas usa alguns pontos, não os pré-determinados. Com a abordagem volumétrica / voxel, você começa com uma grade rígida (3D) e então a preenche (ou não) dependendo de qual é a forma.

O vista projetada é o único de sua lista que é armazenado como imagens 2D de alguma forma e não é de fato um arquivo 3D, mas sim uma matriz de imagens 2D que permite a interpretação do usuário (e alguns IAs também) para criar um 3D conceitual entendimento.

Todos os arquivos 3D ainda são dados binários e há uma série de formatos de arquivo de padrões abertos e proprietários para dados 3D, cada um com seus méritos e fraquezas relativos, e com sua própria base de usuários e de uso.

Malhas descreva apenas o superfície geometria da geometria 3D fornecida (que podem ser descritos como matrizes de polígonos) e são armazenados em arquivos como .obj, .fbx, .stl, .iges, .step, .3ds, .lwo, .lxo e assim por diante - embora a maioria deles possa tb podem ser considerados tipos de arquivos de "cena", pois podem conter dados de cena diferentes de malha específicos para seus respectivos aplicativos - localização, orientação e tipos de luzes, câmeras, matrizes de ambiente etc. 3D DCC (Digital Content C(reation) aplicativos têm seus próprios formatos de arquivo de malha proprietários usados ​​para armazenar suas próprias bibliotecas predefinidas - por exemplo, embora os arquivos de cena modo sejam .lxo, os arquivos predefinidos são .lxl. Seja claro, mesmo apenas uma malha básica não é uma matriz de polis: se os vértices foram corretamente mesclados (soldados em termos do Maya) é importante para a distorção ou animação de uma malha, mas em termos de simplesmente definir localizações de polígonos no espaço, vértices co-incidentes não são problemáticos - poderíamos, por exemplo definir todos os polis de uma malha de forma que os polis estejam nos lugares corretos, com as relações espaciais corretas, mas não sendo unificados, haveria uma enorme multiplicidade de vértices e uma malha quase inútil na maioria dos casos de uso do mundo real . Oh - a maioria dos formatos de arquivo orientados para malha podem armazenar informações de tag de polígono, que podem estar relacionadas a grupos de suavização, mapas normais, mapas UV, mapas de textura, mapas de vértices, cores de vértices, vinculação e mapas de peso. e animação. Então, onde antes .obj era o formato de troca escolhido para a maioria dos artistas 3D, é mais comum .fbx atualmente, já que .fbx é supereficaz e eficiente no armazenamento de dados de animação e deformação.

Volumétrico faz não referem-se apenas à modelagem de voxel, mas podem ser genericamente descritos como uma abordagem de modelagem em que todas as geometrias são definidas como "sólidos" versus apenas superfícies - há algumas implicações matemáticas imensas, tanto para como as coisas são calculadas, como os objetos são definidos e como outras operações são realizadas ao modelar desta maneira - a maioria das ferramentas de autoria BIM (ArchiCAD, Revit, Bently / Microstation por exemplo) pensam desta forma - você define a largura e a altura de um elemento linear como uma parede ou viga, você diz à ferramenta BIM quais são os materiais constituintes (ou compostos para paredes, por exemplo) e, em seguida, você extrai um determinado comprimento: o aplicativo "sabe" o suficiente sobre os materiais no composto, calcule as interseções corretas de sua junção de dois desses elementos lineares oblíquos ângulo. Esses dados podem ser armazenados em formatos de arquivo proprietários e podem ser (no caso de arquivos BIM) trocados entre aplicativos BIM concorrentes usando o formato de arquivo IFC.

Nuvens pontuais, como já descrito, são efetivamente uma lista de pontos no espaço, normalmente definidos por uma varredura (ou às vezes uma simulação de partículas) e podem vir em um dos cerca de meia dúzia de formatos de arquivo. Eles eram originalmente mais comumente encontrados em campos de engenharia, arquitetura e levantamento, e usados ​​apenas para transmitir geometria - hoje em dia, a maioria das nuvens de pontos que recebemos também contém informações de cores de vértices, portanto, se sua ferramenta de escolha lê na nuvem de pontos corretamente, você obtém uma espécie de sensação de foto 3D pixelizada em seu espaço de trabalho 3D. esses arquivos são realmente muito pequenos para os dados que contêm, mas na maioria das ferramentas de engenharia BIM ou 3D, eles tendem a funcionar muito pesadamente na GPU depois que você lê seus dados. Vários 3D DCC ferramentas têm algoritmos de malha que permitem criar malhas de superfície a partir de nuvens de pontos, definindo uma resolução de destino, de modo que os dados que você trouxe para referência se tornem algo com que você possa realmente trabalhar.

Existe hoje em dia também um todo outro categoria de informação volumétrica 3D - a VDB é um formato amplamente utilizado que embora associado à modelagem de voxel não é exclusivo dele (você posso até mesmo pegar dados de nuvem de pontos e convertê-los em VDB, que pode ter alguns aplicativos e casos de uso interessantes). Ter em mente que a maioria ferramentas de simulação de fluidos que não são de engenharia comumente usadas no mundo da modelagem 3D podem exportar seus dados de nuvem de partículas como arquivos VDB - para que você possa simular em algo como RealFlow e trazer seus dados para a ferramenta de modelagem ou renderização de sua escolha. e existem todos os tipos de outras fertilizações cruzadas acontecendo agora - onde você pode usar uma simulação de partículas em uma ferramenta para gerar fumaça, trazer isso para outra ferramenta de simulação e usá-la como uma base para uma segunda simulação de, digamos, faíscas e relâmpagos, então traga os dois sims para uma terceira ferramenta de geração de malha, modelagem e renderização.


1 resposta 1

Isso parece um trabalho para a ferramenta Knife! (Atalho padrão K).

Antes de começar, entretanto, você pode querer converter para quads, que normalmente são mais fáceis de trabalhar - selecione a malha inteira no modo de edição (o atalho é A para selecionar tudo, normalmente) e ainda no modo de edição use ctrl-j por padrão - embora apenas digitar quad na função de pesquisa de comando retornará Tris para Quads como a segunda opção. A pesquisa de comandos é muito útil quando você não sabe onde encontrar um comando. F3 deve abri-lo, embora eu geralmente escolha o modo de interface onde está vinculado ao Espaço, como eu o uso com frequência.)

Quando estiver no modo de edição, pressione K, clique onde deseja que o corte comece (ele se ajustará às arestas e vértices, e você provavelmente deve começar de uma aresta, mas não precisa necessariamente estar em nenhum ponto específico dessa aresta) e clique em cada novo ponto que você deseja.

Ele cortará novos vértices na malha para formar essa geometria. Se você pressionou Z ao longo do caminho, ele cortará todo o caminho, caso contrário, ele apenas funcionará no lado visível para o qual você está olhando.

De qualquer forma, faça alguns cortes no comprimento dos dedos, e você pode começar a limpar todas as outras bordas enquanto mantém as novas bordas. Você precisará fazer novas faces (possivelmente atribuindo texturas) e provavelmente até mesmo mover alguns dedos um pouco para deixá-lo pronto para o rig.

Outra ferramenta útil é o comando Rip (atalho V no modo de edição), que essencialmente pega um vértice (ou conjunto de vértices / arestas / qualquer coisa) e o divide em vários, com o lado rasgado dependendo de onde seu cursor está quando você o invoca . Brinque com ele, veja se você precisa.

Juntas, essas seriam as duas coisas principais que eu usaria para dividir essa malha. Depois disso, usando F (fazer face) ou alt-F (preencher um monte de faces - às vezes nem sempre confiável, mas muito mais rápido quando funciona) para preencher os buracos que você acabou de fazer para que os dedos tenham faces laterais reais onde eles costumavam ser unidos, e você deve estar a maior parte do caminho até lá.


1 resposta 1

Isso é ruim. O software de computador é notoriamente ruim em lidar de forma inteligente com indivíduos variáveis ou funcionalidades que pode ser analisado em duas ou mais colunas em uma matriz de modelo. Parte de mim se pergunta se é intencional, como se quisesse fazer o usuário fazer a si mesmo as perguntas difíceis. Variáveis ​​categóricas são certamente um exemplo disso. Modelos não lineares sofisticados para variáveis ​​contínuas, como splines, também sofrem desse problema.

A questão aqui não é com a função objetivo particular (por exemplo, confiabilidade CV, ou AIC ou BIC), mas com a estratégia de seleção de modelo passo a passo particular sendo empregada para "passar" pela família de modelos paramétricos. Você pode "remover" ou "adicionar" uma única coluna, você tem que "remover" ou "adicionar" as 2+ colunas correspondentes ao fator de nível 3+ simultaneamente.

É algo que pode ser feito facilmente com a otimização "manual", dependendo de suas habilidades de codificação R. Não sei o que se passa por baixo do capô com bestglm, mas você terá os mesmos problemas com a seleção de modelo para frente e ou para trás.

Algumas soluções práticas para os novatos R seriam as seguintes:

1) criar variáveis ​​indicadoras para cada nível de fator. Você pode diminuir 1 nível do fator no bestglm, mas não o outro. leva a resultados muito confusos.

2) fatores pseudocontínuos ou ordinais podem ser codificados apenas como variáveis ​​contínuas.

3) [melhor opção] em vez de usar um processo de seleção de modelo automatizado, proponha alguns modelos práticos e, potencialmente, use CV ou BIC ou ROCs para comparar a utilidade relativa de cada modelo.


Como avaliar o modelo com classificação binária de dados desequilibrados?

Eu tenho um problema de classificação binária. Estou usando a área sob a curva de recuperação de precisão como a métrica de avaliação. As dimensões dos meus dados são (211, 1361). Os dados estão desequilibrados, então usei várias técnicas de amostragem para resolver o problema de desequilíbrio. Eu dividi os dados em conjuntos de treinamento e teste.

Estou usando os seguintes classificadores para esta tarefa:

Em seguida, avaliei todos os modelos usando dados de treinamento com estratégias de amostragem diferentes (sobreamostragem aleatória, sob amostragem aleatória, SMOTE, ADASYN) usando validação cruzada de dobras k estratificadas com k = 10. Calculei a pontuação média e o desvio padrão na pontuação do teste para ver o quão variado minhas previsões são em dez dobras. A reamostragem é feita dentro da validação cruzada.

Em seguida, calculei algumas estatísticas com base nos resultados de cv acima.

Depois de fazer cv, avaliei meus modelos no conjunto de dados de teste que não fazia parte do cv. Não fiz nenhum tipo de reamostragem desses dados.

aqui está a matriz de confusão sobre os dados de teste:

Classificadores não ensemble não tiveram um bom desempenho, então decidi usar o método ensemble.

Decidi ir com [RF + ADASYN], pois deu 100% de pontuação de trem, 93% de validação cruzada AUPRC e 97% em dados finais não vistos.

Quando treinei RF em dados ADASYN completos e testei em um conjunto de teste invisível. Ele teve um desempenho muito ruim. Como tenho poucos dados, estou suspeitando que pode ser insuficiente, mas é apenas um palpite. Quaisquer sugestões a esse respeito seriam úteis.


3 respostas 3

A melhor maneira que conheço é usar Cozimento. Você deve ter seu plano (ou qualquer que seja o objeto de baixa resolução) mapeado UV com uma nova imagem atribuída a todas as faces que você deseja assar (selecione faces no modo de edição, selecione / selecione novamente a imagem no Editor de Imagens). Em seguida, nas configurações de Renderização, na parte inferior está o painel de cozimento.

Normalizado permite que você especifique uma distância máxima Selecionado para Ativo também é importante, habilite-o para garantir que o deslocamento seja feito de todos os objetos selecionados para o objeto ativo / último selecionado.

Exemplo: (Observe que o cozimento não funciona bem com geometria sobreposta - neste exemplo, a parte inferior da esfera e do toro foi excluída, e a esfera foi movida para cima para garantir que não colidisse com o toro. Não fazer isso produzirá artefatos.)


2 respostas 2

É um problema de normalidade que pode acontecer com alguns objetos importados, você precisa ir no Painel de propriedades & gt Object Data & gt Geometry Data, e Limpar dados normais de divisão personalizada:

  • Seu mapa UV está meio torcido. Acho que você mesmo viu de uma certa maneira e tentou consertar, de modo que no final o mapa de cores meio que se encaixa. Mas permaneceu distorcido, o que fará com que o sombreador flua na direção errada em torno de seu objeto, por exemplo.

Uma maneira de testar seus mapas UV é criar uma nova textura em seu editor UV e, em vez de deixar a caixa de listagem em & quotblank & quot, mude para Grade UV ou grade de cores.

  • Cada textura que é não um mapa de cores deve ser definido para dados não coloridos. Você encontrará esta configuração no nó de textura dentro do Sombreamento aba. O ponto é nomeado Espaço colorido.

Sem se aprofundar muito nisso, seu especular basicamente parece estranho devido ao fato de que seu objeto tem menos geometria. Basicamente, quanto mais geometria você fornecer ao seu objeto, mais detalhadas serão as imagens. Mas mais não é o melhor para todas as situações, depende!

Mas quando você adiciona alguns loops ao seu objeto, você verá um resultado muito melhor imediatamente. Eu estava com preguiça e acabei de adicionar um modificador subsurf 2 vezes para mostrar. Quando você compara ambos, você vê os lados comprimidos e nenhuma especularidade de borda, por exemplo


Assista o vídeo: DjangoCon 2019 - Maps with GeoDjango, PostGIS and Leaflet