Take the 2-minute tour ×
Geographic Information Systems Stack Exchange is a question and answer site for cartographers, geographers and GIS professionals. It's 100% free, no registration required.

I am attempting to write a script to get the end points of a series polylines, and then use those end points to create a polygon. I'm not sure which tools to begin to use on this project.

I would prefer to use QGIS or even better a python script using open source tools.

Thanks, Ryan

share|improve this question
    
This is a similar post which outlines retrieving the end nodes of a street segment in qGIS: gis.stackexchange.com/questions/28092/… –  evv_gis Feb 10 at 18:21

2 Answers 2

up vote 9 down vote accepted

It is easier with Fiona, more "Pythonic", and list slicing:

import fiona
with fiona.drivers():
   for line in fiona.open("some_shapefile.shp"):
         # print first and last point of every line
         print line['geometry']['coordinates'][0], line['geometry']['coordinates'][-1]

And with shapely:

from shapely.geometry import Point
for line in fiona.open("some_shapefile.shp"):
   print Point(line['geometry']['coordinates'][0]), Point(line['geometry']['coordinates'][-1])

And you can construct you polygon and save it with Fiona

New: using the suggestion of sgillies (boundary) with the shape function of shapely

from shapely.geometry import shape
for line in fiona.open("some_shapefile.shp"):
     print shape(line['geometry']).boundary[0], shape(line['geometry']).boundary[1]
share|improve this answer
1  
Gene, the boundary() method of a Shapely object might be more reliable. See toblerity.org/shapely/manual.html#MultiLineString. –  sgillies Feb 10 at 21:38
    
Great answer, gene. Just one correction, the boundary of the MultiLineString could have more than 2 points if it is complex. –  cag Feb 11 at 10:16

You can do this with the GDAL/OGR python bindings. Here's a link to the OGR API tutorial.

A worked example:

from osgeo import ogr

ds=ogr.Open(somepolylines)
lyr=ds.GetLayer()
for i in range(lyr.GetFeatureCount()):
    feat=lyr.GetFeature(i)
    geom=feat.GetGeometryRef()
    firstpoint=geom.GetPoint(0)
    lastpoint=geom.GetPoint(geom.GetPointCount()-1)
    print firstpoint[0],firstpoint[1],lastpoint[0],lastpoint[1] #X,Y,X,Y
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.