popsu-d7/sites/all/modules/geofield/geofield.devel_generate.inc
Bachir Soussi Chiadmi 1bc61b12ad first import
2015-04-08 11:40:19 +02:00

166 lines
4.5 KiB
PHP

<?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 || abs($number) === 180) {
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 line
function _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 line
function _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) . ')';
}