(gelöst) Nach Update auf GMap 6.x-2.0-beta1 klappt die Umkreissuche nicht mehr?
am 07.04.2013 - 09:26 Uhr in
Hallo,
ich habe gerade das Modul GMap upgedatet, da die 1er Version keinen Support mehr hatte. Ich habe auf GMap 6.x-2.0-beta1 erneuert...
Zuerst musste ich mir dann einen neuen API Key machen, hat geklappt....die Karten funktionierten dann auch wieder und meine User wurden darauf angezeigt....
Aber nun ist mir etwas aufgefallen:
- ich hatte vorher in einem View mit der Filtereinstellung "Ort: Distance / Proximity" User in meiner Nähe in einem bestimmten Radius
anzeigen lassen...das hat super geklappt und ist sehr schick....
- Nur wenn sich jetzt ein neuer User anmeldet, dann klappt es nicht mehr?! Er bekommt immer 5-6 User angezeigt, wo anscheinend irgendetwas mit der Location nicht
stimmt....
- bei den alten Usern stimmt noch alles in dem View
Ich habe irgendwie keine Idee, wo ich noch nachjustieren muss?!
Hat jemand einen Tipp?
- Anmelden oder Registrieren um Kommentare zu schreiben
Ich habe gerade einmal den
am 07.04.2013 - 09:41 Uhr
Ich habe gerade einmal den View dupliziert und nochmals bei einem neuen User nachgesehen: es werden anscheinend nur die User aufgelistet, wo tatsächlich die Bestimmung des Ortes nicht funkioniert hat?!
Bzw. ich muss mal schauen, vielleicht ist der Ort des neuen Users nicht korrekt bestimmt....hmm
aaach, tatsächlich die
am 07.04.2013 - 09:43 Uhr
aaach, tatsächlich die Koordinaten, also
Breitengrad und Längengrad werden bei einem NEUEN User nicht automatisch bestimmt, wieso??
hmmm, wenn ich mir diese
am 07.04.2013 - 11:03 Uhr
hmmm, wenn ich mir diese anleitung (http://drupal.org/node/1038034) durchlese, dann müsste ich den neuen usern erst einmal das recht erteilen, dass sie überhaupt latitude/longitude eingeben dürfen...
klappt aber nicht, wenn ich den haken setze bei
BERECHTIGUNGEN:
location-Modul
submit latitude/longitude für den gast, dann speichert drupal nicht???
Google geocoding returned
am 07.04.2013 - 12:33 Uhr
Google geocoding returned status code: 610
hmm, dies scheint ein größeres Problem zu sein, wenn man sich das hier so ansieht:
http://drupal.org/node/1940474
uff, ich muss noch weiter suchen
hää, google beendet den
am 07.04.2013 - 12:35 Uhr
hää, google beendet den support für die alte version und die neue startet erst im september 2013???
ich glaube ich installiere wieder das alte modul
https://developers.google.com/maps/documentation/geocoding/v2/
oh shit, probiert und jetzt
am 07.04.2013 - 12:56 Uhr
oh shit, probiert und jetzt geht natürlich der alte api code nicht mehr.....
mann eye
so, wieder auf die neuere
am 07.04.2013 - 13:22 Uhr
so, wieder auf die neuere version umgestellt und immer noch auf der suche nach der lösung:
http://drupal.org/node/1940474
die comments hier verstehe ich irgendwie noch nicht... wo muss welcher hack in welchen quellcode?
Hilfe ist denn niemand da, der auch solche probleme hat?
ich werde nachher mal diesen
am 07.04.2013 - 19:33 Uhr
ich werde nachher mal diesen hack ausprobieren...und berichten...es hat ja anscheinend niemand einen tipp?!
so...habe die datei
am 07.04.2013 - 21:31 Uhr
so...habe die datei google.inc angepasst und nun sieht sie so aus:
<?php
/**
* @file
* Google geocoder.
*/
/**
* Returns an XML document containing the list of countries supported by the
* Google geocoder.
* A cached version is stored in the Drupal cache in case Google is unreachable.
*/
function google_geocode_country_list_xml() {
// Get the google data from the feed.
$source = drupal_http_request('http://spreadsheets.google.com/feeds/list/p9pdwsai2hDMsLkXsoM05KQ/default/public/values');
if (!$source->data) {
// Use the cache.
$data = cache_get('location_google');
if (!defined('LIBXML_VERSION') || (version_compare(phpversion(), '5.1.0', '<'))) {
$xml = simplexml_load_string($data->data, NULL);
}
else {
$xml = simplexml_load_string($data->data, NULL, LIBXML_NOERROR | LIBXML_NOWARNING);
}
}
else {
if (!defined('LIBXML_VERSION') || (version_compare(phpversion(), '5.1.0', '<'))) {
$xml = simplexml_load_string($source->data, NULL);
// Stores the XML in the cache to eventually use it later.
cache_set('location_google', $xml->asXML());
}
else {
$xml = simplexml_load_string($source->data, NULL, LIBXML_NOERROR | LIBXML_NOWARNING);
// Store the XML in the cache to eventually use it later.
cache_set('location_google', $xml->asXML());
}
}
return $xml;
}
/**
* Return the list of ISO3166 codes supported by this geocoder.
* Coverage list: http://gmaps-samples.googlecode.com/svn/trunk/mapcoverage_filtered.html
* Coverage list feed: http://spreadsheets.google.com/feeds/list/p9pdwsai2hDMsLkXsoM05KQ/defaul...
*/
function google_geocode_country_list() {
// Get the google data from the feed.
$xml = google_geocode_country_list_xml();
// Loop through google data and find all valid entries.
$regionclean = array();
foreach($xml->entry as $region) {
$pos = strpos($region->content, 'geocoding:') + 11;
$geocoding = substr($region->content, $pos, strpos($region->content, ',', $pos) - $pos);
if (strpos($geocoding, "Yes") !== FALSE) {
$regionclean[] = t(htmlentities($region->title));
}
}
// Get the countries list and clean it up so that names will match to google.
// The regex removes parenthetical items so that both of the "Congo" entries
// and the "Coco Islands" work.
// The $countriesfixes overwrites values in the Drupal API countries list
// with values that will match to google's entries.
// "Sao Tome and Principe" are non-accented in the Drupal API so the entry
// here is to match the htmlentities() fix in the foreach loop below.
// Note: it may be neccessary to adjust/add to the fixes list in the future
// if google adds countries that don't match the Drupal API list for whatever
// reason.
$countries = location_get_iso3166_list();
$regex = "#[ (].*[)]#e";
$cntryclean = preg_replace($regex, "", $countries);
$countriesfixes = array_merge($cntryclean, array(
"hk" => t("China"),
"mo" => t("China"),
"pn" => t("Pitcairn Islands"),
"wf" => t("Wallis Futuna"),
"st" => t("São Tomé and Príncipe"),
));
// Compare new google data found to fixed country name values and return
// matches with abbreviations as keys.
$googlematched = array_intersect($countriesfixes, $regionclean);
// Compare new keys to original Drupal API and return the array with the
// original name values.
$fixedkeys = array_intersect_key($countries, $googlematched);
return array_keys($fixedkeys);
}
/**
* Return general information about this geocoder.
*/
function google_geocode_info() {
return array(
'name' => 'Google Maps',
'url' => 'http://maps.google.com',
'tos' => 'http://www.google.com/help/terms_local.html',
'general' => TRUE,
);
}
/**
* Perform a geocode on a location array.
* @param $location
* The location array to process.
* @return
* an associative array with keys 'lat' and 'lon' containing the coordinates.
*/
function google_geocode_location($location = array()) {
if (function_exists('gmap_get_key')) {
$key = gmap_get_key();
}
else {
$key = variable_get('location_geocode_google_apikey', '');
}
$query = array(
'key' => $key,
'sensor' => 'false', // Required by TOS.
'output' => 'xml',
//'ll' => 0,
//'spn' => 0,
'gl' => $location['country'],
'q' => _google_geocode_flatten($location),
'address' => _google_geocode_flatten($location),
'sensor' => 'false', // Required by TOS
);
$url = url('http://maps.google.com/maps/geo', array(
$url = url('http://maps.googleapis.com/maps/api/geocode/json', array(
'query' => $query,
'external' => TRUE,
));
$http_reply = drupal_http_request($url);
$delay_trigger = TRUE;
$status_code_match = array();
preg_match('/<code>(.*)<\/code>/', $http_reply->data, $status_code_match);
$status_code = $data->status;
if ($status_code != 'OK') {
watchdog('location', 'Google geocoding returned status code: %status_code', array('%status_code' => $data->status));
return NULL;
}
$location = $data->results[0]->geometry->location;
$status_code = $data->status;
if ($status_code != 'OK') {
watchdog('location', 'Google geocoding returned status code: %status_code', array('%status_code' => $data->status));
return NULL;
}
$accuracy_code_match = array();
preg_match('/Accuracy="([0-9])"/', $http_reply->data, $accuracy_code_match);
$accuracy_code = $accuracy_code_match[1];
$min_accuracy = variable_get('location_geocode_' . $location['country'] . 'google_accuracy_code', variable_get('location_geocode_google_minimum_accuracy', '3'));
if ($accuracy_code < $min_accuracy) {
watchdog('location', 'Google geocoding result for %country did not meet the minimum accuracy level of %min_accuracy. Result accuracy: %accuracy_code', array('%country' => $location['country'], '%min_accuracy' => $min_accuracy, '%accuracy_code' => $accuracy_code));
return NULL;
}
$latlon_match = array();
preg_match('/<coordinates>(.*)<\/coordinates>/', $http_reply->data, $latlon_match);
$latlon_exploded = explode(',', $latlon_match[1]);
return array('lat' => $latlon_exploded[1], 'lon' => $latlon_exploded[0]);
return array('lat' => $location->lat, 'lon' => $location->lng);
}
/**
* General settings for this geocoder.
*/
function google_geocode_settings() {
$form = array();
$key = '';
if (function_exists('gmap_get_key')) {
$key = gmap_get_key();
}
if (!empty($key)) {
$form['location_geocode_google_apikey'] = array(
'#type' => 'item',
'#title' => t('Google Maps API Key'),
'#value' => $key,
'#description' => t('The key in use was automatically provided by GMap.'),
);
}
else {
$form['location_geocode_google_apikey'] = array(
'#type' => 'textfield',
'#title' => t('Google Maps API Key'),
'#size' => 64,
'#maxlength' => 128,
'#default_value' => variable_get('location_geocode_google_apikey', ''),
'#description' => t('In order to use the Google Maps API geocoding web-service, you will need a Google Maps API Key. You can obtain one at the !sign_up_link for the !google_maps_api. PLEASE NOTE: You will <em>not</em> have to re-enter your API key for each country for which you have selected Google Maps for geocoding. This setting is global.', array('!sign_up_link' => '<a href="http://www.google.com/apis/maps/signup.html">sign-up page</a>', '!google_maps_api' => '<a href="http://www.google.com/apis/maps/">Google Maps API</a>'))
);
}
$country = arg(4);
if ($country) {
$form['location_geocode_' . $country . '_google_accuracy_code'] = array(
'#type' => 'select',
'#title' => t('Google Maps Geocoding Accuracy for %country', array('%country' => $country ) ),
'#default_value' => variable_get('location_geocode_' . $country . '_google_accuracy_code', variable_get('location_geocode_google_minimum_accuracy', '3')),
'#options' => location_google_geocode_accuracy_codes(),
'#description' => t('The minimum required accuracy for the geolocation data to be saved.'),
);
}
return $form;
}
function _google_geocode_flatten($location = array()) {
// Check if its a valid address
if (empty($location)) {
return '';
}
$address = '';
if (!empty($location['street'])) {
$address .= $location['street'];
}
if (!empty($location['city'])) {
if (!empty($address)) {
$address .= ', ';
$address .= ' ';
}
$address .= $location['city'];
}
if (!empty($location['province'])) {
if (!empty($address)) {
$address .= ', ';
$address .= ' ';
}
// @@@ Fix this!
if (substr($location['province'], 0, 3) == $location['country'] . '-') {
$address .= substr($location['province'], 3);
watchdog('Location', 'BUG: Country found in province attribute.');
}
else {
$address .= $location['province'];
}
}
if (!empty($location['postal_code'])) {
if (!empty($address)) {
$address .= ' ';
}
$address .= $location['postal_code'];
}
if (!empty($location['country'])) {
if (!empty($address)) {
$address .= ', ';
$address .= ' ';
}
$address .= $location['country'];
}
return $address;
}
leider klappt es immer noch nicht....
nun habe ich gesehen, dass es schon location 6.x-3.3-beta2 gibt....mal ausprobieren :))
so, nun musste ich
am 07.04.2013 - 21:41 Uhr
so, nun musste ich feststellen, es gibt schon location 6.x-3.3-beta3 und nochmal...
soooooo, nachdem ich ja hier
am 07.04.2013 - 21:59 Uhr
soooooo,
nachdem ich ja hier leider gar keine antwort bzw. kommentar erhalten habe, bin ich stolz auf mich!
es hat nach dieser irrfahrt dann doch noch geklappt!
mit der installation von location 6.x-3.3-beta3
erzeugt drupal nun endlich mit der anmeldung eines neuen users auch automatisch das GEOCODING!
es wird wieder automatisch bei der anmeldung der user breitengrad und längengrad erzeugt und nun klappt natürlich auch die umkreissuche bzw. die userssuche!
juhu, ich hab mal was gelöst!