Find co-ordinates where LineString intersects a Po

2019-07-03 16:35发布

问题:

Is there a way in Turfjs to determine the co-ordinates at which a LineString intersects with the border of a polygon?

There's a number of ways to find out if a point is within a polygon and a number of ways to find out if a point is on a line and so on, but I can't seem to figure out a way to ask "at what point does this line intersect this polygon's border".

I could enumerate the points in the polygon using a line intersection algorithm to find that point but I was wondering if there's a more "turf" way of doing this.

For context, I've loaded a GPX track and want to estimate the location/time at which the track enters/exits a defined area.

Because a GPX track only records locations at specific intervals it usually the case that pN recorded at time tN is outside the area and pN+1 recorded at time tN+1 is inside the area. If I can get the point at which line (pN, pN+1) intersects the polygon's border I can estimate the exact time the track crosses into the polygon.

回答1:

Ultimately, turfjs does not seem to have an API for doing this.

I was able to get the answer I wanted by enumerating the points in the polygon from the GeoJSON object to construct a sequence of line segments and then I used maxogden/geojson-js-utils linesIntersect function to test for intersection points.



回答2:

I don't see a Turf function that does exactly that, but there is intersect, which finds the area of intersection between two polygons.

You could:

  1. Construct a polygon by joining the line to itself reversed (so ABC becomes ABCBA)
  2. Find the intersection of ABCBA and P, the original polygon using Intersect.
  3. The intersection should be a zero-area polygon that is the part of ABCBA inside P. Somehow compute the length of it (strangely there's no perimeter function).
  4. Subtract that length from the original length of ABC.

Not exactly elegant, true. :)

EDIT

Tried this. Turns out Turf-intersect doesn't return intersections if one of the polygons is zero-area.