Pré RTree passo: Dividir um conjunto de pontos em regiões rectangulares, cada uma contendo um ponto
-
23-08-2019 - |
Pergunta
dada a minha posição atual (lat, long) eu quero encontrar rapidamente o vizinho mais próximo em alguns pontos de problema de interesse. Assim, eu pretendo usar um banco de dados R-Tree, que permite a pesquisa rápida. No entanto, pela primeira vez o banco de dados deve ser preenchido - é claro. Portanto, eu preciso determinar as regiões retangulares que cobre a área, onde cada região contém um ponto de interesse.
A minha pergunta é como faço para pré-processar os dados, isto é, como faço para subdividir a área em destas sub-regiões retangulares? (Eu quero regiões retangulares, porque eles são facilmente adicionados ao RTree - em contraste com as regiões mais gerais Voronoi)
./ John
Solução
Editar: O abaixo funciona abordagem, mas ignora a característica crítica de R árvores - que o comportamento de divisão de nós R-árvores é bem definido, e mantém uma árvore equilibrada (através B- árvore-como propriedades). Então, na verdade, tudo que você tem a fazer é:
- Escolha o número máximo de retângulos por página
- Criar retângulos de sementes (pontos de uso mais distantes um do outro, centroids, qualquer que seja).
- Para cada ponto, escolha um retângulo para colocá-lo em
- Se já cai em um único retângulo, colocá-lo lá
- Se isso não acontecer, estender o retângulo que deve ser prorrogado menos (diferentes maneiras de medir saídas "menos" - Obras área)
- Se vários retângulos aplicar - escolher um baseado em quão cheia é, ou alguma outra heurística
- Se ocorrer estouro - use a partição quadrática para mover as coisas ao redor ...
- E assim por diante, usando algoritmos R-árvores saído de um livro de texto.
Eu acho que o método abaixo é ok para encontrar seus retângulos iniciais de sementes; mas você não deseja preencher todo o seu R-tree dessa forma. Fazendo as divisões e reequilibrar o tempo todo pode ser um pouco caro, então você provavelmente vai querer fazer um pedaço decente do trabalho com a abordagem KD abaixo; não apenas todo o trabalho.
A abordagem KD:. Tudo enclose em um retângulo
Se o número de pontos do retângulo é> limiar, varredura na direção D até cobrir a metade dos pontos.
Dividir em retângulos esquerda e direita (ou acima e abaixo) o ponto de divisão).
Chamar o mesmo procedimento recursivamente sobre os novos retângulos, com a próxima direção (se você estava indo para a esquerda para a direita, agora você vai de cima para baixo, e vice-versa).
A vantagem que isso tem sobre a dividir em quadrados abordagem oferecidas por outro cartaz é que ele acomoda distribuições pontuais distorcidas melhor.
Outras dicas
Oracle Spatial Cartucho documentação descreve algoritmo tessellation que pode fazer o que quiser. Em suma:
- coloque todos os seus pontos no quadrado
- Se praça contém 1 ponto - índice quadrado
- Se praça não contém pontos - ignorá-lo
- Se praça contém mais de 1 ponto
- quadrado dividido em 4 quadrados iguais e análise de repetição para cada novo quadrado
resultado deve ser algo como isto:
alt texto http: // Download- uk.oracle.com/docs/cd/A64702_01/doc/cartridg.805/a53264/sdo_ina5.gif
Eu acho que você a algo que falta na declaração do problema. Suponha que você tenha N pontos (x, y) tal que cada ponto tem um X- única e coordenada y. Você pode dividir sua área em retângulos N seguida por apenas dividindo-a em n colunas verticais. Mas isso não ajudá-lo a resolver o problema POI mais próximo facilmente, não é? Então eu acho que você está pensando em algo sobre a estrutura retângulo que você ainda não articulada.
Ilustração:
| | | | |5| | |
|1| | | | |6| |
| | |3| | | | |
| | | | | | | |
| |2| | | | | |
| | | | | | |7|
| | | |4| | | |
Os números são destinos e as linhas verticais mostram uma subdivisão em 7 áreas rectangulares. Mas, claramente, não há muita informação "interessante" na subdivisão. Existe algum critério adicional sobre a subdivisão que você não mencionou?