| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 | <?php/** * @file * Create random data to populate geofields. *//** * Implements hook_devel_generate(). */function geofield_devel_generate($object, $field, $instance, $bundle) {  if (field_behaviors_widget('multiple values', $instance) == FIELD_BEHAVIOR_CUSTOM) {    return devel_generate_multiple('_geofield_devel_generate', $object, $field, $instance, $bundle);  }  else {    return _geofield_devel_generate($object, $field, $instance, $bundle);  }}function _geofield_devel_generate($object, $field, $instance, $bundle) {  $object_field = array();  $type = str_replace('geofield_', '', $instance['widget']['type']);  $val = array(    'wkt' => NULL,    'lat' => NULL,    'lon' => NULL,    'top' => NULL,    'bottom' => NULL,    'right' => NULL,    'left' => NULL,  );  if ($type == 'latlon' || $type == 'bounds') {    list($val['lon'], $val['lat']) = _random_point();    // don't actually need lat/lon but provide a center for our bounds    if ($type == 'bounds') {      $lat_diff = _dd_generate(2, 10) / 100;      $lon_diff = _dd_generate(2, 10) / 100;      $val['left']   = $val['lon'] - $lon_diff;      $val['right']  = $val['lon'] + $lon_diff;      $val['top']    = $val['lat'] - $lat_diff;      $val['bottom'] = $val['lat'] + $lat_diff;    }  }  else {    $type = 'wkt';    $val['wkt'] = _wkt_generate();  }  $values = geofield_compute_values($val, $type);  return $values;}/** * Helper to generate DD coordinates */function _dd_generate($min, $max, $int = FALSE) {  $func = 'rand';  if (function_exists('mt_rand')) {    $func = 'mt_rand';  }  $number = $func($min, $max);  if ($int) {    return $number;  }  $decimals = $func(1, pow(10, 5)) / pow(10, 5);  return round($number + $decimals, 5);}/** * Helper to generate a random WKT string * * Try to keeps values sane, no shape is more than 100km across */function _wkt_generate() {  $types = array(    'point',    'linestring',    'polygon',    'multipoint',    'multilinestring',    'multipolygon',  );  // don't always generate the same type  shuffle($types);  $type = $types[0];  $func = '_wkt_generate_' . $type;  if (function_exists($func)) {    $wkt = $func();    return drupal_strtoupper($type) . ' (' . $wkt . ')';  }  return 'POINT (0 0)';}function _random_point() {  $lon = _dd_generate(-180, 180);  $lat = _dd_generate(-84, 84);  return array($lon, $lat);}function _wkt_generate_point($point = FALSE) {  $point = $point ? $point : _random_point();  return '(' . implode(' ', $point) . ')';}function _wkt_generate_multipoint() {  $num = _dd_generate(1, 5, TRUE);  $start = _random_point();  $points[] = _wkt_generate_point($start);  for ($i = 0; $i < $num; $i += 1) {    $diff = _random_point();    $start[0] += $diff[0] / 100;    $start[1] += $diff[1] / 100;    $points[] = _wkt_generate_point($start);  }  return implode(', ', $points);}// make a line that looks like a linefunction _wkt_generate_linestring($start = FALSE, $segments = FALSE) {  $start = $start ? $start : _random_point();  $segments = $segments ? $segments : _dd_generate(1, 5, TRUE);  $points[] = $start[0] . ' ' . $start[1];  // Points are at most 1km away from each other  for ($i = 0; $i < $segments; $i += 1) {    $diff = _random_point();    $start[0] += $diff[0] / 100;    $start[1] += $diff[1] / 100;    $points[] = $start[0] . ' ' . $start[1];  }  return implode(", ", $points);}// make a line that looks like a linefunction _wkt_generate_multilinestring() {  $start = _random_point();  $num = _dd_generate(1, 3, TRUE);  $lines[] = _wkt_generate_linestring($start);  for ($i = 0; $i < $num; $i += 1) {    $diff = _random_point();    $start[0] += $diff[0] / 100;    $start[1] += $diff[1] / 100;    $lines[] = _wkt_generate_linestring($start);  }  return '(' . implode('), (', $lines) . ')';}function _wkt_generate_polygon($start = FALSE, $segments = FALSE) {  $start = $start ? $start : _random_point();  $segments = $segments ? $segments : _dd_generate(2, 4, TRUE);  $poly = _wkt_generate_linestring($start, $segments);  // close the polygon  return '(' . $poly . ' , ' . $start[0] . ' ' . $start[1] . ')';}function _wkt_generate_multipolygon() {  $start = _random_point();  $num = _dd_generate(1, 5, TRUE);  $segments = _dd_generate(2, 3, TRUE);  $poly[] = _wkt_generate_polygon($start, $segments);  for ($i = 0; $i < $num; $i += 1) {    $diff = _random_point();    $start[0] += $diff[0] / 100;    $start[1] += $diff[1] / 100;    $poly[] = _wkt_generate_polygon($start, $segments);  }  return '(' . implode(', ', $poly) . ')';}
 |