$vn_lat1, 'max_latitude' => $vn_lat1, 'min_longitude' => $vn_long1, 'max_longitude' => $vn_long1 ); } $vn_state = 1; break; case 1: // conjunction switch($vs_token) { case '~': $vn_state = 3; break(2); case '..' : $vn_state = 2; break(2); default: $vn_state = 2; break; } // fall through case 2: // second lat/long $va_tmp = explode(',', $vs_token); if (sizeof($va_tmp) != 2) { return false; } $vn_lat2 = (float)$va_tmp[0]; $vn_long2 = (float)$va_tmp[1]; if (($vn_lat1 == 0) || ($vn_lat2 == 0) || ($vn_long1 == 0) || ($vn_long2 == 0)) { return null; } return array( 'min_latitude' => ($vn_lat1 > $vn_lat2) ? $vn_lat2 : $vn_lat1, 'max_latitude' => ($vn_lat1 < $vn_lat2) ? $vn_lat2 : $vn_lat1, 'min_longitude' => ($vn_long1 > $vn_long2) ? $vn_long2 : $vn_long1, 'max_longitude' => ($vn_long1 < $vn_long2) ? $vn_long2 : $vn_long1, ); break; case 3: // distance // // TODO: The lat/long delta calculations below are very rough. We should replace with more accurate formulas. // $t_length = new LengthAttributeValue(); $va_length_val = $t_length->parseValue($vs_token, array('displayLabel' => 'distance')); $vn_length = ((float)array_shift(explode(' ', preg_replace('![^\d\.]+!', '', $va_length_val['value_decimal1'])))) / 1000; // kilometers $vn_lat1_km = (10000/90) * $vn_lat1; $vn_long1_km = (10000/90) * $vn_long1; $vn_lat1 = (($vn_lat1_km + ($vn_length/2)))/(10000/90); $vn_long1 = (($vn_long1_km + ($vn_length/2)))/(10000/90); $vn_lat2 = (($vn_lat1_km - ($vn_length/2)))/(10000/90); $vn_long2 = (($vn_long1_km - ($vn_length/2)))/(10000/90); if (($vn_lat1 == 0) || ($vn_lat2 == 0) || ($vn_long1 == 0) || ($vn_long2 == 0)) { return null; } return array( 'min_latitude' => ($vn_lat1 > $vn_lat2) ? $vn_lat2 : $vn_lat1, 'max_latitude' => ($vn_lat1 < $vn_lat2) ? $vn_lat2 : $vn_lat1, 'min_longitude' => ($vn_long1 > $vn_long2) ? $vn_long2 : $vn_long1, 'max_longitude' => ($vn_long1 < $vn_long2) ? $vn_long2 : $vn_long1, ); break; } } return false; } ?>