只要半径足够小(应该是 100 米,除非你就在北极或南极旁边),一个简单的线性近似应该足够好:
def perimeter_point(lat, lon, angle, radius)
# convert angle from degrees to radians
angle *= Math::PI / 180
# convert meters to degrees approximately, assuming spherical Earth
radius /= 6371000 * Math::PI / 180
# calculate relative length of the circle of longitude compared to equator
scale = Math.cos( lat * Math::PI / 180 );
# add offsets to longitude and latitude and return them
# (I'm assuming that angle = 0 means due east)
lat += radius * Math.sin(angle)
lon += radius * Math.cos(angle) / scale
return lat, lon
end
请注意,如果您的中心点在 180 度子午线附近,这可能会返回低于 -180 或高于 +180 的经度。如果这是一个问题,请检查它并根据需要进行标准化。(如果中心点在北极或南极附近,则±90 范围之外的输出纬度在技术上也是可行的,但无论如何我使用的近似值在两极附近都会失效。)