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 have a complex (self crossing) line with Z values which I'd like to truncate to the area inside a box. The problem is Shapely splits the line into simple (non-crossing) sections and the Z value at the intersection of the loop is incorrect.

My high-level goal is taking a pile of GPS tracks, trimming them to only include the area in a box and calculate speed within the box. I'm using Z to represent seconds. I suspect this problem is deep in geos. Can you suggest a better approach?

I made a pretty picture of this example at http://i.stack.imgur.com/pQxtH.png but it may not work since I'm new here.

from shapely.geometry import LineString
import shapely.geometry
box = shapely.geometry.box(1, 1, 4, 5)
line = LineString([(2, 0, 0), (2, 4, 4), (3, 4, 5), (3, 3, 6), (0, 3, 9)])
[[p for p in l.coords] for l in line.intersection(box)]

results in:

[[(2.0, 1.0, 1.0), (2.0, 3.0, 5.0)],
 [(2.0, 3.0, 5.0), (2.0, 4.0, 4.0), (3.0, 4.0, 5.0), (3.0, 3.0, 6.0), (2.0, 3.0, 5.0)],
 [(2.0, 3.0, 5.0), (1.0, 3.0, 8.0)]]

but I was expecting only this segment:

[(2,1,1), (2,4,4), (3,4,5), (3,3,6), (1,3,8)]


shapely.__version__
'1.2.17'
shapely.geos.geos_version_string
'3.2.2-CAPI-1.6.2'
share|improve this question

Your Answer

 
discard

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

Browse other questions tagged or ask your own question.