Turfjs / turf

A modular geospatial engine written in JavaScript and TypeScript
https://turfjs.org/
MIT License
9.22k stars 935 forks source link

nearestPointOnLine deviation #1440

Open MichelBahl opened 6 years ago

MichelBahl commented 6 years ago

Here is an small example.

Some points at the line were calculated right on point and some were calculated with a deviation.

I wanna know what's the reason for the deviation, for me it seems to be to big for an round-off error.

rowanwins commented 6 years ago

Good question @MichelBahl

Will have to take a scratch through the code base to work out what's going on. Probably a low priority though for me at the moment sorry, so might take a little while before I get to it.

EricPKerr commented 6 years ago

@MichelBahl Can you show what the actual deviation is with the ones in the example that you're saying are off the line? The snapped points look like they're on the line when zooming in.

https://github.com/Turfjs/turf/blob/master/packages/turf-nearest-point-on-line/index.ts#L71:L77

It's calling destination and bearing to compute the perpendicular line to pass into lineIntersects, which ends up doing https://github.com/Turfjs/turf/blob/master/packages/turf-line-intersect/index.ts#L96:L98 and could potentially be running into float arithmetic overflow (??) Completely guessing here, but if the snapped point is off by millimeters that might be what's actually happening?

ngottlieb commented 4 years ago

I think this is the same issue that @zazagag pointed out in #1726. Most (if not all?) of the time, if you test a nearestPointOnLine result with booleanPointOnLine, you get false...

crubier commented 3 years ago

This issue is THE big blocker preventing me to use turf for anything serious, it should be a very high priority.

I have examples ( in #2023 ) where nearestPointOnLine is off by 50km on lines that are 500km! That's 10%

In turn it impacts other functions and "contaminates" a large part of turf:

rowanwins commented 3 years ago

Hi @crubier

As you mentioned over in https://github.com/Turfjs/turf/issues/2023#issuecomment-779723498 yes this is most likely an inconsistency as to whether things are using a rhumb vs haversine calculations, and so the longer a line you use then the worse the effects are.

That said, TurfJS is maintained by the good will of a few individuals in their spare time, we do our best to fix various issues but catering to everyone else's priorities is always going to be close to impossible. Pull requests are always welcome. One day Turf will hopefully be robust and consistent, but it will take a while (JTS is still under development after starting in the year 2000).

Thanks, Rowan

crubier commented 3 years ago

Hi @rowanwins no problem, I noticed that and I myself have not much time to maintain my own open source contributions, so I know the pain.

I'd happily contribute to turf if I had time or no alternative, but for now I fallback to using qgis and python more my precision-critical stuff. I would have loved to use Turf for that, but as I said this is not possible for now.

I'm not complaining or asking anyone to take action, just explaining the limitations, so that other users don't waste a few days like I did trying to implement complex precision-critical algorithms on top of turf, only to realize that this is not currently possible.

Turf is awesome and I love it, it's perfect for a lot of use cases but it's good to warn people that it is not an implementation correct enough for uses cases that need precision. The idea of having a nice and clean JS reference GIS library is awesome, I hope we'll get there one day.

I don't have time but my company sponsors open source projects and I'd be happy to sponsor turf to help reach this goal. I'm not able to spend massive amounts though, so we'd need some sort of sponsor community to really get this off the ground

smallsaucepan commented 1 day ago

Hi @MichelBahl. Not sure if you recall this issue. Was your expectation that nearestPointOnLine would take you to the nearest vertex of a line segment? Rather than the nearest point along that line?

Revisiting some of these issues and realise I'm not 100% on what your original report was pointing out. Thanks