null+****@clear*****
null+****@clear*****
2012年 5月 31日 (木) 18:32:23 JST
HAYASHI Kentaro 2012-05-31 18:32:23 +0900 (Thu, 31 May 2012)
New Revision: b59a7fee7eef268dd275ababd1aae7898cc92a44
Log:
test: fix to consider the boundary of longitude
Modified files:
test/function/tools/geo/generate-grntest-data.rb
Modified: test/function/tools/geo/generate-grntest-data.rb (+74 -7)
===================================================================
--- test/function/tools/geo/generate-grntest-data.rb 2012-05-31 18:16:13 +0900 (6424445)
+++ test/function/tools/geo/generate-grntest-data.rb 2012-05-31 18:32:23 +0900 (3a00865)
@@ -501,16 +501,83 @@ class GrnTestData
((Math::PI / (GRN_GEO_RESOLUTION * 180)) * (value))
end
+ def calculate_to_180_degree(longitude, latitude)
+ latitude_start = geo_int2rad(latitude)
+ longitude_start = geo_int2rad(longitude)
+ latitude_end = geo_int2rad(latitude)
+ longitude_end = geo_int2rad(180 * GRN_GEO_RESOLUTION)
+ longitude_diff = (longitude_end - longitude_start)
+ latitude_sum = (latitude_start + latitude_end)
+ xdistance = longitude_diff * Math.cos(latitude_sum * 0.5)
+ (xdistance * GRN_GEO_RADIUS).floor
+ end
+
+ def calculate_distance(longitude_start, latitude_start,
+ longitude_end, latitude_end)
+ start_latitude = geo_int2rad(latitude_start.abs)
+ start_longitude = geo_int2rad(longitude_start.abs)
+ end_latitude = geo_int2rad(latitude_end.abs)
+ end_longitude = geo_int2rad(longitude_end.abs)
+ longitude_diff = (end_longitude - start_longitude)
+ x = longitude_diff * Math.cos((start_latitude + end_latitude) * 0.5)
+ y = (end_latitude - start_latitude)
+ (Math.sqrt((x * x) + (y * y)) * GRN_GEO_RADIUS).floor
+ end
+
def geo_distance(app_type)
case app_type
when "", "rect", "rectangle"
- lat1 = geo_int2rad(@latitude_start.to_i)
- lng1 = geo_int2rad(@longitude_start.to_i)
- lat2 = geo_int2rad(@latitude_end.to_i)
- lng2 = geo_int2rad(@longitude_end.to_i)
- x = (lng2 - lng1) * Math.cos((lat1 + lat2) * 0.5)
- y = (lat2 - lat1)
- return (Math.sqrt((x * x) + (y * y)) * GRN_GEO_RADIUS).floor
+ if type_of_diff_in_longitude == "short"
+ calculate_distance(@longitude_start.to_i,
+ @latitude_start.to_i,
+ @longitude_end.to_i,
+ @latitude_end.to_i)
+ else
+ if @latitude_start_degree == @latitude_end_degree
+ east_distance = calculate_to_180_degree(@longitude_start.to_i.abs,
+ @latitude_start.to_i.abs)
+ west_distance = calculate_to_180_degree(@longitude_end.to_i.abs,
+ @latitude_end.to_i.abs)
+ east_distance + west_distance
+ else
+ case quadrant
+ when "1stto2nd"
+ rounded_longitude = @longitude_end_degree + 360
+ rounded_latitude = @latitude_end_degree
+ longitude_delta = rounded_longitude - @longitude_start_degree
+ latitude_delta = rounded_latitude - @latitude_start_degree
+ slope = latitude_delta / longitude_delta.to_f
+ intercept = @latitude_start_degree - slope * @longitude_start_degree
+ latitude_on_180 = slope * 180 + intercept
+ east_distance = calculate_distance(@longitude_start.to_i,
+ @latitude_start.to_i,
+ 180 * GRN_GEO_RESOLUTION,
+ latitude_on_180 * GRN_GEO_RESOLUTION)
+ west_distance = calculate_distance(@longitude_end.to_i,
+ @latitude_end.to_i,
+ 180 * GRN_GEO_RESOLUTION,
+ latitude_on_180 * GRN_GEO_RESOLUTION)
+ east_distance + west_distance
+ when "2ndto1st"
+ rounded_longitude = @longitude_start_degree + 360
+ rounded_latitude = @latitude_start_degree
+ longitude_delta = @longitude_end_degree - rounded_longitude
+ latitude_delta = @latitude_end_degree - rounded_latitude
+ slope = latitude_delta / longitude_delta.to_f
+ intercept = @latitude_end_degree - slope * @longitude_end_degree
+ latitude_on_180 = slope * 180 + intercept
+ east_distance = calculate_distance(@longitude_end.to_i,
+ @latitude_end.to_i,
+ 180 * GRN_GEO_RESOLUTION,
+ latitude_on_180 * GRN_GEO_RESOLUTION)
+ west_distance = calculate_distance(@longitude_start.to_i,
+ @latitude_start.to_i,
+ 180 * GRN_GEO_RESOLUTION,
+ latitude_on_180 * GRN_GEO_RESOLUTION)
+ east_distance + west_distance
+ end
+ end
+ end
end
end