Skip to content

Commit 9a7e3e2

Browse files
committed
Fix #262 by revering back some "optimizations"
1 parent d4ad98e commit 9a7e3e2

File tree

2 files changed

+10
-5
lines changed

2 files changed

+10
-5
lines changed

rtree2d-core/shared/src/main/scala/com/github/plokhotnyuk/rtree2d/core/Geometry.scala

+8-5
Original file line numberDiff line numberDiff line change
@@ -208,15 +208,18 @@ trait Spherical {
208208
} else {
209209
val maxLatSin = sin(maxLat * radPerDegree)
210210
val maxLatCos = sqrt(1 - maxLatSin * maxLatSin)
211-
val latCosPerLonDeltaCos = latCos * cos(min(normalize(minLon - lon), normalize(lon - maxLon)) * radPerDegree)
211+
val closestLon =
212+
if (normalize(minLon - lon) <= normalize(lon - maxLon)) minLon
213+
else maxLon
214+
val latCosPerLonDeltaCos = latCos * cos((closestLon - lon) * radPerDegree)
215+
val extremumLat = atan(latSin / latCosPerLonDeltaCos)
212216
val normalizedDistanceCos = max(
213217
latSin * minLatSin + latCosPerLonDeltaCos * minLatCos,
214218
latSin * maxLatSin + latCosPerLonDeltaCos * maxLatCos)
215-
val extremumLatTan = latSin / latCosPerLonDeltaCos
216-
if (extremumLatTan * minLatCos <= minLatSin || extremumLatTan * maxLatCos >= maxLatSin) normalizedDistanceCos
219+
if (extremumLat <= minLat || extremumLat >= maxLat) normalizedDistanceCos
217220
else {
218-
val extremumLatCos = sqrt(1 / (1 + extremumLatTan * extremumLatTan))
219-
val extremumLatSin = extremumLatTan / extremumLatCos
221+
val extremumLatSin = sin(extremumLat * radPerDegree)
222+
val extremumLatCos = sqrt(1 - extremumLatSin * extremumLatSin)
220223
max(latSin * extremumLatSin + latCosPerLonDeltaCos * extremumLatCos, normalizedDistanceCos)
221224
}
222225
}

rtree2d-core/shared/src/test/scala/com/github/plokhotnyuk/rtree2d/core/GeometryTest.scala

+2
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@ class GeometryTest extends AnyFunSuite {
128128
assert(distance(0, 0, entry(0, 180, 3)) === 20037.508f +- 23f) // Null Island <-> Anti-meridian, in km
129129
assert(intercept[UnsupportedOperationException](distance(0, 0, RTree[Int](Nil)))
130130
.getMessage === "RTreeNil.minY")
131+
// The issue test: https://github.com/plokhotnyuk/rtree2d/issues/262
132+
assert(distance(18.0f, -74.3f, entry(17.84f, -67.38f, 18.62f, -65.51f, 3)) === 731.6392f +- 1.0f)
131133
}
132134

133135
test("EllipsoidalEarth.radius") {

0 commit comments

Comments
 (0)