(Library) 緯度・経度情報から面積を計算する
作成者: 西本絵梨子
編集履歴:
- 2018-8-24(Fri): 新規作成
概要
緯度、経度の情報から面積(≒矩形面積)を計算します。
緯度幅を小さく取ることで、矩形近似をしています。
間違いなどを見つけられましたら、西本( eriko _at_ gfd-dennou.org )までご連絡いただけると助かります。
依存ライブラリ
- GPhys
使用方法
経度slonからelon, 緯度slatからelatで囲まれた部分の面積を計算。
GPhys_Function::calc_area_from_lat_lon( slon, elon, slat, elat, n_dlat )
ARGUMENTS * slon, elon : start and end points in longitude (Numeric or UNumeric) * slat, elat : start and end points in latitude (Numeric or UNumeric) * n_dlat : number of partitions in latitude (Numeric, default=10) RETURN VALUE * area : area enclosed by slon, elon, slat, elat (UNumeric)
ソース
require "numru/gphys" include NumRu module GPhys_Function module_function #-- constant @radius=UNumeric.new(6.37E6,"m") # radius of the planet def deg_to_rad( deg, type ) if deg.class!=UNumeric if type=="lon" deg=UNumeric.new(deg,"degrees_east") elsif type=="lat" deg=UNumeric.new(deg,"degrees_north") end end rad=deg.convert("rad") return rad, deg end#-- def deg_to_rad( deg, type ) def calc_area_from_lat_lon( slon, elon, slat, elat, n_dlat=10 ) slon_rad, = deg_to_rad( slon, "lon" ) elon_rad, = deg_to_rad( elon, "lon" ) slat_rad, = deg_to_rad( slat, "lat" ) elat_rad, = deg_to_rad( elat, "lat" ) #-- dlon lon_ratio=(elon_rad-slon_rad)/(UNumeric.new(2.0*Math::PI,"rad")) #-- Δlatを小さくとって緯度円計算し、足し合わせ dlat_rad=(elat_rad-slat_rad)/n_dlat.to_f lat_length=@radius*dlat_rad.val puts "n_dlat=#{n_dlat}\n" puts "dlat=#{dlat_rad}, #{dlat_rad.convert("degrees_north")}\n" puts "lat_length=#{lat_length}\n\n" area=0.0 n_dlat.times{|ilat| theta=slat_rad+dlat_rad*ilat lon_circ_length=(2.0*Math::PI*@radius*theta.cos)*lon_ratio area_tmp=lon_circ_length*lat_length #p "#{theta.convert("degrees_north")}, #{lon_circ_length}, area=#{area_tmp}" if ilat==0 area=area_tmp else area+=area_tmp end }#-- n_dlat.times{|ilat| return area end#-- def calc_area_in_lat_lon( slon, elon, slat, elat, n_dlat=nil ) #----- Sample if __FILE__==$0 slon, elon, slat, elat = 0, 360, -90, 90 n_dlat=180 area=calc_area_from_lat_lon( slon, elon, slat, elat, n_dlat ) areaEarth=4.0*Math::PI*@radius**2 puts "\nerror percentage" puts "#{((area-areaEarth)/areaEarth)*100} %" end end#-- module GPhys_Function
キーワード:
参照: