Guest User

Untitled

a guest
Jan 22nd, 2018
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.75 KB | None | 0 0
  1. require 'mysql'
  2. require 'geo_ruby'
  3.  
  4. include GeoRuby::SimpleFeatures
  5.  
  6. def generate_js_border_overlay(output_file)
  7. factory = GeometryFactory.new
  8. wkt_parser = EWKTParser.new(factory)
  9.  
  10. borderDB = Mysql::new('localhost', 'root', '', 'bordersdb')
  11. res = borderDB.query("select name, iso2, AsText(ogc_geom), region from world_boundaries where region=150")
  12. encoded_polygon_desc = "";
  13. remove_warnings_layer = "function removeBordersOverlay() {\n"
  14. add_warnings_layer = "function addBordersOverlay() {\n"
  15. init_borders = "function initBorders() {\n"
  16. res.each do |row|
  17. name, iso2, multi_polygon, region = *row
  18. processed_polygon = wkt_parser.parse(multi_polygon);
  19. encoded_polygon_desc << "var encodedPolygon_#{iso2};\n"
  20. add_warnings_layer << "map.addOverlay(encodedPolygon_#{iso2});\n"
  21. remove_warnings_layer << "map.removeOverlay(encodedPolygon_#{iso2});\n"
  22. init_borders << "encodedPolygon_#{iso2} = \
  23. new GPolygon.fromEncoded({\n\
  24. polylines: ["
  25. factory.geometry.each do |landmass|
  26. landmass.rings.each do |ring|
  27. encoded = encode_by_reducing_pointcount(ring.points)
  28. init_borders << "{color: \"black\",\n\
  29. weight: 5,\n\
  30. points: '"
  31. init_borders << encoded[0].gsub(/\\/, '\&\&') + "',\n\
  32. levels: '#{encoded[1]}',\n\
  33. zoomFactor: 2,\n numLevels: 2}"
  34. init_borders << "," unless ring == landmass.rings.last && landmass == factory.geometry.last
  35. init_borders << "\n"
  36. end
  37. end
  38. init_borders << "],\nfill:true,\n\
  39. opacity:0.7,\n\
  40. color: '#2956B2'\n\
  41. });"
  42. end
  43.  
  44.  
  45. add_warnings_layer << "\n}"
  46. remove_warnings_layer << "\n}"
  47. init_borders << "\n}"
  48. File.open(output_file, 'w') {|f|
  49. f.write(encoded_polygon_desc + "\n")
  50. f.write(add_warnings_layer + "\n")
  51. f.write(remove_warnings_layer + "\n")
  52. f.write(init_borders)
  53. }
  54. end
  55.  
  56. def encode_by_reducing_pointcount(points)
  57. dlat = plng = plat = dlng = 0
  58. res = ["",""]
  59. index = -1
  60. for point in points
  61. index += 1
  62. #straight point reduction algorithm: use every 5th point only
  63. #use all points if their total count is less than 16
  64. next if index.modulo(5) != 0 && points.size > 16
  65. late5 = (point.y * 1e5).floor
  66. lnge5 = (point.x * 1e5).floor
  67. dlat = late5 - plat;
  68. dlng = lnge5 - plng;
  69. plat = late5;
  70. plng = lnge5;
  71. res[0] << encode_signed_number(dlat)
  72. res[0] << encode_signed_number(dlng)
  73. res[1] << encode_number(3)
  74. end
  75. return res
  76. end
  77.  
  78. def encode_signed_number(num)
  79. sig_num = num << 1
  80. sig_num = ~sig_num if sig_num < 0
  81. encode_number(sig_num)
  82. end
  83.  
  84. def encode_number(num)
  85. res = ""
  86. while num >= 0x20 do
  87. res << ((0x20 | (num & 0x1f)) + 63).chr
  88. num >>= 5
  89. end
  90. res << (num + 63).chr
  91. return res
  92. end
  93.  
  94. generate_js_border_overlay("/tmp/bordersOverlay.js")
Add Comment
Please, Sign In to add comment