Tengo dos archivos shape que contienen dos tipos de características geométricas: una contiene polígonos y la otra cadenas de líneas.
Porque me gustaría utilizar el Dentro del método para comprobar si el final (o el principio) de una cadena de líneas se encuentra dentro de un polígono situado en el otro archivo shape, necesito acceder a los puntos primero y último (como características geométricas). Por el momento itero a través de la característica linestring y puedo identificar los puntos utilizando geometry.GetPoint(x) que devuelve las coordenadas x e y de ese punto.
Pero cuando me gustaría usar within para comprobar si un punto determinado cae en el objeto polígono no puedo porque como explicó Paolo en esta pregunta Necesito la referencia geométrica (utilizando GetGeometryRef())de un punto que se puede recuperar como:
...
pointshp = driver.Open('test.shp')
pointlyr = pointshp.getLayer(0)
point = pointlyr.GetNextFeature()
point_geom = point.GetGeometryRef()
point_geom.Within(polygon_geom)
pero en realidad estoy abriendo un shp que tiene características linestring. Así que después de hojear Utah State University Diapositivas del SIG se me ocurrió esto:
def within(pointcoord):
driver = ogr.GetDriverByName('test.shp')
ds = driver.CreateDataSource('test.shp')
layer = ds.CreateLayer('test',geom_type=ogr.wkbPoint)
fieldDefn = ogr.FieldDefn('id',ogr.OFTInteger)
layer.CreateFiled(fieldDefn)
featureDefn = layer.GetLayerDefn()
feature = ogr.feature(featureDefn)
point = ogr.Geometry(ogr.wkbPoint)
point.AddPoint(pointcoord[0],pointcoord[1])
feature.SetGeometry(point)
feature.SetField('id',1)
layer.CreateFeature(feature)
pointlyr = layer.GetLayer(0)
point = pointlyr.GetNextFeature()
point_geom = point.GetGeometryRef()
for x in xrange(len(polygons))
point_geom.Within(Network.polygons[x].GetGeometryRef())
Lo que me parece realmente ineficiente. Así que sólo por el bien de la utilización de un método(dentro) Tengo que crear no sólo una capa, pero un shapefile, cuando todo lo que realmente necesito es una simple característica de punto desde el que puedo obtener la referencia de geometría para compararlo con el de los polígonos.
La pregunta es, ¿cómo crear una característica de punto (temporal, para ser destruido) a partir de coordenadas x e y? ¿O hay una manera más sencilla de hacerlo que el ejemplo anterior?
Por otro lado, ¿hay alguna otra forma de obtener la referencia geométrica del punto inicial o final (como elemento geométrico) de un elemento de línea?