На самом деле это не ответ, но поле для комментариев слишком короткое для того, что я хочу опубликовать, и этот результат оказался довольно высоким, когда я искал ответ. Код BertNase выше хорош, и я им пользуюсь. Тем не менее, есть некоторые странности вокруг крайних случаев. Я не уверен на 100%, что код неправильный, так как я все еще изучаю гео, но я добавляю параметры из своего тестового примера junit, который я написал вокруг него. Например, долгота увеличивается от 180 до -90, когда я двигаюсь на юг на 100 м (случай 10)
/*0*/ { inputOf(0.0, 0.0), NORTH, shouldGiveAnswerOf(0.0009, 0.0) },
/*1*/ { inputOf(0.0, 0.0), SOUTH, shouldGiveAnswerOf(-0.0009, 0.0) },
/*2*/ { inputOf(0.0, 0.0), WEST, shouldGiveAnswerOf(0.0, -0.0009) },
/*3*/ { inputOf(0.0, 0.0), EAST, shouldGiveAnswerOf(0.0, 0.0009) },
/*4*/ { inputOf(90.0, 180.0), NORTH, shouldGiveAnswerOf(89.9991, -180.0) },
/*5*/ { inputOf(0.0, 180.0), NORTH, shouldGiveAnswerOf(0.0009, -180.0) },
/*6*/ { inputOf(-90.0, 180.0), NORTH, shouldGiveAnswerOf(-89.9991, -180.0) },
/*7*/ { inputOf(90.0, -180.0), NORTH, shouldGiveAnswerOf(89.9991, -180.0) },
/*8*/ { inputOf(0.0, -180.0), NORTH, shouldGiveAnswerOf(0.0009, -180.0) },
/*9*/ { inputOf(-90.0, -180.0), NORTH, shouldGiveAnswerOf(-89.9991, -180) },
/*10*/ { inputOf(90.0, 180.0), SOUTH, shouldGiveAnswerOf(89.9991, -90.0) },
/*11*/ { inputOf(0.0, 180.0), SOUTH, shouldGiveAnswerOf(-0.0009, -180.0) },
/*12*/ { inputOf(-90.0, 180.0), SOUTH, shouldGiveAnswerOf(-89.9991, -90.0) },
/*13*/ { inputOf(90.0, -180.0), SOUTH, shouldGiveAnswerOf(89.9991, -90.0) },
/*14*/ { inputOf(0.0, -180.0), SOUTH, shouldGiveAnswerOf(-0.0009, -180.0) },
/*15*/ { inputOf(-90.0, -180.0), SOUTH, shouldGiveAnswerOf(-89.9991, -90) },
/*16*/ { inputOf(90.0, 180.0), EAST, shouldGiveAnswerOf(89.9991, -90.0) },
/*17*/ { inputOf(0.0, 180.0), EAST, shouldGiveAnswerOf(0.0, -179.9991) },
/*18*/ { inputOf(-90.0, 180.0), EAST, shouldGiveAnswerOf(-89.9991, -90.0) },
/*19*/ { inputOf(90.0, -180.0), EAST, shouldGiveAnswerOf(89.9991, -90.0) },
/*20*/ { inputOf(0.0, -180.0), EAST, shouldGiveAnswerOf(0.0, -179.9991) },
/*21*/ { inputOf(-90.0, -180.0), EAST, shouldGiveAnswerOf(-89.9991, -90) },
/*22*/ { inputOf(10.0, 5.0), NORTH, shouldGiveAnswerOf(10.0009, 5.0) },
/*23*/ { inputOf(10.0, 5.0), SOUTH, shouldGiveAnswerOf(9.9991, 5.0) },
/*24*/ { inputOf(10.0, 5.0), WEST, shouldGiveAnswerOf(10.0, 4.999086) },
/*25*/ { inputOf(10.0, 5.0), EAST, shouldGiveAnswerOf(10.0, 5.000914) },
/*26*/ { inputOf(10.0, 5.0), NORTH_EAST, shouldGiveAnswerOf(10.000636, 5.000646) },