Atualmente, estou trabalhando em um projeto no qual preciso construir uma rede topológica a partir dos recursos de geometria encontrados nos shapefiles. Até agora, usando o projeto de código aberto de Ben Reilly, eu consegui transformar cadeias de linhas em bordas da redex, além de detectar recursos próximos (dizem outras cadeias de linhas) e adicioná-los ao ponto mais próximo para que eu possa executar algoritmos de caminho mais curto.
Mas isso é bom para um shapefile. No entanto, agora preciso conectar recursos de diferentes shapefiles a um grande gráfico de redex. Assim, por exemplo, se um ponto estiver dentro de um polígono, eu o conectaria (por conectá-lo, quero dizer adicionar uma borda de redex - add_edge (g.GetPoint (1), g.GetPoint (2)) com o ponto no próximo shapefile também está dentro de um polígono que compartilha um atributo semelhante (digamos, ID). Observe que os polígonos nos diferentes shps compartilham apenas os mesmos IDs e não as coordenadas.Os pontos que se enquadram nos polígonos também não compartilham as mesmas coordenadas.
Minha solução para esse problema foi identificar o ponto que reside em um polígono, armazená-lo, encontrar o ponto no próximo shapefile que reside no polígono com o mesmo ID e adicionar a borda da redex entre eles.
Como descobrir se um ponto reside dentro de um polígono? Bem, existe um algoritmo bem conhecido: o algoritmo RayCasting que faz isso. Foi aqui que fiquei realmente preso, porque, para implementar o algoritmo, preciso das coordenadas do polígono e não sei como acessá-las agora, mesmo depois de percorrer uma documentação da Geometria do OGR. Então, a pergunta que estou perguntando é como acessar os pontos poligonais ou coordenadas OU existe uma maneira mais fácil de detectar se um ponto se enquadra em um polígono? Usando python com a biblioteca osgeo.ogr, codifiquei o seguinte:
if g.GetGeometryType() == 3: #polygon
c = g.GetDimension()
x = g.GetPointCount()
y = g.GetY()
z = g.GetZ()
veja a imagem para uma melhor compreensão do meu problema.
[EDIT] Até agora, tentei armazenar todos os objetos de polígono em uma lista com a qual compararia o primeiro e o último ponto da cadeia de linhas . Mas o exemplo de Paolo está relacionado ao uso da referência de objeto de ponto e de referência de objeto de polígono, que não funcionaria com uma referência de objeto de linha, pois nem toda a linha está dentro do polígono, mas o primeiro ou o último ponto de sua cadeia de linhas.
[EDIT3] Criar um novo objeto de ponto de geometria a partir das coordenadas do primeiro e último ponto da cadeia de linhas e, em seguida, usá-lo para comparar com os objetos de geometria de polígono salvos em uma lista, parece funcionar bem:
for findex in xrange(lyr.GetFeatureCount()):
f = lyr.GetFeature(findex)
flddata = getfieldinfo(lyr,f,fields)
g = f.geometry()
if g.GetGeometryType() == 2:
for j in xrange(g.GetPointCount()):
if j == 0 or j == g.GetPointCount():
point = ogr.Geometry(ogr.wkbPoint)
point.AddPoint(g.Getx(j),g.GetY(j))
if point.Within(Network.polygons[x][0].GetGeometryRef()):
print g.GetPoint(j)