[EDIT: a solução para isso era simplesmente usar OGR para ler shapefiles. Veja o exemplo da geographika.]
Em um shapefile da ESRI, não há distinção entre polígonos e multipolígonos. Além disso, não há distinção explícita entre orifícios internos e anéis externos (além da "mão" de um determinado polígono).
Então, depois de ler um shapefile, tenho uma lista de sequências de coordenadas que descrevem anéis, mas sem um processamento mais intenso, não consigo distinguir quais desses anéis são anéis externos, orifícios internos ou polígonos adicionais.
Parece que para bem torneadas do polígono e MultiPolygon construtores, deve haver uma distinção clara entre exterior e anéis interiores, assim como eu deveria passar de uma lista claro de toques para um conjunto ordenado de polígonos separados, com interior claramente designada e anéis exteriores ?
Resumindo: se eu tenho uma lista de anéis poligonais, mas não sei quais anéis são orifícios no interior ou polígonos separados, como devo classificá-los em polígonos separados com orifícios internos designados?
Estou procurando uma solução algorítmica simples que eu possa implementar em python, que possa ser usada para processar centenas de polígonos em ~ um minuto ou menos, e estou fazendo isso para realizar um grande número de interseções.
Respostas:
Além da resposta da relet sobre como obter polígonos individuais, você pode executar uma interseção em todos os polígonos para criar os orifícios. Se o seu conjunto de dados contém polígonos sobrepostos, você está sem sorte.
Explique novamente o que há de errado com os leitores existentes de shapefile?
Não seria mais fácil exportar IDs de recursos e valores M do shapefile e depois juntá-los de volta aos polígonos depois de usar um leitor de shapefile existente?
Para multipatches, você pode usar a mesma técnica de atribuir IDs de polígono a um "ID de patch" e adicionar esse atributo novamente aos recursos.
Edit: Enquanto você diz que não quer usar o OGR, apenas no caso de mudar de idéia.
A geometria deve ser impressa da seguinte maneira:
O primeiro suporte contém as cordas do anel externo, e os colchetes subsequentes as cordas dos anéis internos. Se você tiver valores de Z, os pontos deverão estar no formato 79285 57742 10 (onde a última coord é uma altura).
Caso contrário, você poderá usar as funções Shapely Contains e Within para avaliar cada polígono entre si e aplicar um índice espacial previamente - http://pypi.python.org/pypi/Rtree/ para acelerar o processamento.
fonte
Primeiro, use ogr para abrir o shapefile:
converter geometrias de shapefile em geometrias bem torneadas
Para os polígonos no multipolígono:
E agora, você pode usar todas as funções de bem torneadas ( bem torneadas )
fonte
Não estou muito familiarizado com o modo como os polígonos são realmente armazenados nos arquivos de formas, mas - um anel de polígono não deveria ser um loop fechado se e somente se a coordenada inicial for repetida? Portanto, se você comparar cada coordenada subsequente com a coordenada inicial, encontrará o primeiro ponto em que um polígono está fechado. Se essa é a última coordenada do polígono, é um polígono simples; caso contrário, é um multipolígono e requer o processamento dos outros loops.
Esse pode ser o 'processamento mais intensivo' que você deseja evitar, mas na verdade é apenas uma iteração pelas coordenadas que é gratuita quando você precisa lê-las de qualquer maneira.
fonte
Conforme indicado por @ inc42 , na página 8 da Descrição técnica do ESRI Shapefile: um white paper da ESRI - julho de 1998 (página 12 de 34 no PDF), há uma discussão sobre o conteúdo dos registros poligonais que pode ser o que você procura:
fonte