Здравствуйте, Bitman72, Вы писали:
B>Есть что-то иное?
Самый главный вопрос — что за точки? Если они расположены на границе территории — это одно.
По углам — другое.
По всей площади — третье.
Третий случай — самый тяжёлый. Как по точкам воостановить площадь фигуры?
Здравствуйте, Bitman72, Вы писали:
B>Проблема такова: есть территория, ограниченная GPS координатами. Нужно вычислить площадь участков.
B>Основная масса фигур — почти прямоугольники, но встречаются очень замысловатые формы. Вот с ними — проблема.
B>Геодезическая точность при вычислении не нужна. Можно считать на сфере. Наверное, можно даже и на плоской проекции.
B>Из того, что уже пробовал: прямоугольник, в который вписана фигура. Разбиение на квадраты. Работает, но долго. В принципе, Монте-Карло работает так же и не значительно быстрее.
B>Есть что-то иное?
Можно
примерно так:
function wsg84_local(p0) -- https://ru.wikipedia.org/wiki/WGS_84
local re,rp,g2r=6378137, 6356752.3142, math.pi/180
local c=math.abs(math.cos(p0.lat*g2r))
local ka,kb=-g2r*re*math.sqrt(1+c*c*((rp/re)^2-1)), g2r*re*c
return function(p) return { x=kb*(p.long-p0.long), y=ka*(p.lat-p0.lat) } end
end
function area(p) local s,n,j=0,#p,#p
for i=1,n do s=s+p[i].x*p[j].y-p[j].x*p[i].y j=i end
return math.abs(s)/2
end
function apply(src,fn) local r={} for k,v in pairs(src) do table.insert(r,fn(v)) end return r end
function printf(...) print(string.format(...)) end
function show_gps_points(p) print "{" for k,v in pairs(p) do printf("\t{ lat=%.7f, long=%.7f },",v.lat,v.long) end print "}" end
function show_points(p) io.write'<path d="M' for k,v in pairs(p) do io.write(("%.1f,%.1f "):format(v.x,v.y)) end print 'z"/>' end
function from_yandex_map(url) local res,p,h,t,long,lat,dlong,dlat={},1
h,t,long,lat=url:find("rl=([^%%]+)%%2C([^~&]+)",p) if not t then error() end
lat=tonumber(lat) long=tonumber(long) table.insert(res,{lat=lat,long=long})
while t do
p=t+1 h,t,dlong,dlat=url:find("^~([^%%]+)%%2C([^~&]+)",p) if not t then break end
lat=lat+tonumber(dlat) long=long+tonumber(dlong)
table.insert(res,{lat=lat,long=long})
end
return res
end
gps_points=from_yandex_map[[
https://yandex.ru/maps/?ll=37.602844%2C55.730905&rl=37.602660%2C55.731591~0.001375%2C-0.000459~-0.001035%2C-0.000917~-0.001350%2C0.000483&rlt=area&z=18.92
]]
-- show_gps_points(gps_points)
points=apply(gps_points, wsg84_local( gps_points[1] ) )
-- show_points(points)
printf("S=%.0f [m^2]",area(points))
S=11951 [m^2]