GeoGenerator.php 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. <?php
  2. /**
  3. * @file
  4. * Helper class for generating random WKT/Geospatial data.
  5. */
  6. class GeoGenerator {
  7. /**
  8. * Helper to generate DD coordinates
  9. */
  10. function dd_generate($min, $max, $int = FALSE) {
  11. $func = 'rand';
  12. if (function_exists('mt_rand')) {
  13. $func = 'mt_rand';
  14. }
  15. $number = $func($min, $max);
  16. if ($int || $number === $min || $number === $max) {
  17. return $number;
  18. }
  19. $decimals = $func(1, pow(10, 5)) / pow(10, 5);
  20. return round($number + $decimals, 5);
  21. }
  22. /**
  23. * Helper to generate a random WKT string
  24. *
  25. * Try to keeps values sane, no shape is more than 100km across
  26. */
  27. function wkt_generate() {
  28. $types = array(
  29. 'point',
  30. 'linestring',
  31. 'polygon',
  32. 'multipoint',
  33. 'multilinestring',
  34. 'multipolygon',
  35. );
  36. // don't always generate the same type
  37. shuffle($types);
  38. $type = $types[0];
  39. $func = 'wkt_generate_' . $type;
  40. if (method_exists($this, $func)) {
  41. $wkt = $this->$func();
  42. return drupal_strtoupper($type) . ' (' . $wkt . ')';
  43. }
  44. return 'POINT (0 0)';
  45. }
  46. function random_point() {
  47. $lon = $this->dd_generate(-180, 180);
  48. $lat = $this->dd_generate(-84, 84);
  49. return array($lon, $lat);
  50. }
  51. function wkt_generate_point($point = FALSE) {
  52. $point = $point ? $point : $this->random_point();
  53. return implode(' ', $point);
  54. }
  55. function wkt_generate_multipoint() {
  56. $num = $this->dd_generate(1, 5, TRUE);
  57. $start = $this->random_point();
  58. $points[] = $this->wkt_generate_point($start);
  59. for ($i = 0; $i < $num; $i += 1) {
  60. $diff = $this->random_point();
  61. $start[0] += $diff[0] / 100;
  62. $start[1] += $diff[1] / 100;
  63. $points[] = $this->wkt_generate_point($start);
  64. }
  65. return implode(', ', $points);
  66. }
  67. // make a line that looks like a line
  68. function wkt_generate_linestring($start = FALSE, $segments = FALSE) {
  69. $start = $start ? $start : $this->random_point();
  70. $segments = $segments ? $segments : $this->dd_generate(1, 5, TRUE);
  71. $points[] = $start[0] . ' ' . $start[1];
  72. // Points are at most 1km away from each other
  73. for ($i = 0; $i < $segments; $i += 1) {
  74. $diff = $this->random_point();
  75. $start[0] += $diff[0] / 100;
  76. $start[1] += $diff[1] / 100;
  77. $points[] = $start[0] . ' ' . $start[1];
  78. }
  79. return implode(", ", $points);
  80. }
  81. // make a line that looks like a line
  82. function wkt_generate_multilinestring() {
  83. $start = $this->random_point();
  84. $num = $this->dd_generate(1, 3, TRUE);
  85. $lines[] = $this->wkt_generate_linestring($start);
  86. for ($i = 0; $i < $num; $i += 1) {
  87. $diff = $this->random_point();
  88. $start[0] += $diff[0] / 100;
  89. $start[1] += $diff[1] / 100;
  90. $lines[] = $this->wkt_generate_linestring($start);
  91. }
  92. return '(' . implode('), (', $lines) . ')';
  93. }
  94. function wkt_generate_polygon($start = FALSE, $segments = FALSE) {
  95. $start = $start ? $start : $this->random_point();
  96. $segments = $segments ? $segments : $this->dd_generate(2, 4, TRUE);
  97. $poly = $this->wkt_generate_linestring($start, $segments);
  98. // close the polygon
  99. return '(' . $poly . ' , ' . $start[0] . ' ' . $start[1] . ')';
  100. }
  101. function wkt_generate_multipolygon() {
  102. $start = $this->random_point();
  103. $num = $this->dd_generate(1, 5, TRUE);
  104. $segments = $this->dd_generate(2, 3, TRUE);
  105. $poly[] = $this->wkt_generate_polygon($start, $segments);
  106. for ($i = 0; $i < $num; $i += 1) {
  107. $diff = $this->random_point();
  108. $start[0] += $diff[0] / 100;
  109. $start[1] += $diff[1] / 100;
  110. $poly[] = $this->wkt_generate_polygon($start, $segments);
  111. }
  112. return '(' . implode(', ', $poly) . ')';
  113. }
  114. }