Lösen Sie Änderungen mithilfe von Werten aus der API aus.
<p>Ich arbeite an einem Projekt, bei dem ich die aktuellen Koordinaten abrufen und als Variablen speichern und diese Parameter dann an GeoNames senden muss, um den Ländercode zu erhalten. Dieser Ländercode wird verwendet, um ein Änderungsereignis in einem Dropdown-Menü auszulösen (das zuvor mit dem Ländercode als Wert gefüllt wurde), das die Grenzen eines Landes anzeigt (unter Verwendung von GeoJSON). Wenn ich tatsächlich auf ein Land im Menü klicke, funktioniert es einwandfrei, aber nachdem ich den Code von GeoNames erhalten habe, kann ich das Änderungsereignis nicht auslösen. Das Problem tritt immer dann auf, wenn ich diese Codezeile hinzufüge, nachdem ich den Ländercode erhalten habe. </p>
<pre class="brush:php;toolbar:false;">$('#countrySelect').val('currCode').change();</pre>
<p>Zusätzlich dazu, dass es nicht funktioniert, erhalte ich auch diese Fehlermeldung: Map.js:291 Uncaught Error: Bounds are not valid.</p><p>Weiß jemand, was ich falsch mache? (Ich verwende PHP zum Dekodieren und erhalte die Karte aus der Broschüre). </p><p>Hier sind die Details:</p><p>Dieser Code wird verwendet, um das Dropdown-Menü zu füllen:</p><p><br /> </p> ;
<pre class="brush:php;toolbar:false;">$.ajax({
URL: „libs/php/geoJson.php“,
Typ: „POST“,
Datentyp: „json“,
Erfolg: Funktion(Ergebnis) {
//console.log(result);
for (var i=0; i<result.data.border.features.length; i++) {
$('#countrySelect').append($('<option>', {
Wert: result.data.border.features[i].properties.iso_a3,
Text: result.data.border.features[i].properties.name,
}));
}
}
});</pre>
<p>Dadurch werden die Grenzen erstellt (und es funktioniert einwandfrei), wenn Länder manuell ausgewählt werden. </p>
<pre class="brush:php;toolbar:false;">var border;
$('#countrySelect').on("change", function() {
let name = $('#countrySelect').val();
//Grenze abrufen + anzeigen
$.ajax({
URL: „libs/php/geoJson.php“,
Typ: 'POST',
Datentyp: 'json',
Erfolg: Funktion(Ergebnis) {
const filterData = result.data.border.features.filter((a) => (a.properties.iso_a3 === name));
border = L.geoJSON(filterData[0]).addTo(map);
map.fitBounds(border.getBounds());
},
});
});</pre>
<p>Dieser Teil des Codes versucht, die Koordinaten abzurufen (was gut zu funktionieren scheint), sie an GeoNames zu übergeben, um den Ländercode zu erhalten (was auch gut zu funktionieren scheint) und löst dann das oben erwähnte Änderungsereignis aus (aber dieser Teil funktioniert nicht).</p>
<pre class="brush:php;toolbar:false;">navigator.geolocation.getCurrentPosition(success);
Funktionserfolg(Position) {
let lat = position.coords.latitude;
let lng = position.coords.longitude;
let coords = {"lat": lat, "lng": lng};
//AJAX-Anfrage mit Koordinaten zu GeoNames, um den Ländercode zu erhalten
$.ajax({
URL: „libs/php/getCurrentCode.php“,
Typ: „POST“,
Datentyp: „json“,
Daten: Koordinaten,
Erfolg: Funktion(Ergebnis) {
console.log(JSON.stringify(result));
if (result.status.name == "ok") {
$(result["data"]["countryCode"]);
let currCode = result.data;
console.log(currCode);
//Änderung mit abgerufenem Code auslösen
$('#countrySelect').val('currCode').change();
};
};
});
};</pre>
<p>我的 php:</p>
<pre class="brush:php;toolbar:false;">ini_set('display_errors', 'On');
error_reporting(E_ALL);
$executionStartTime = microtime(true);
$url='http://api.geonames.org/countryCodeJSON?&lat=' . $_REQUEST['lat'] . '&lng=' . $_REQUEST['lng'] . '&username=&style=full';
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL,$url);
$result=curl_exec($ch);
curl_close($ch);
$decode = json_decode($result,true);
$output['status']['code'] = '200';
$output['status']['name'] = 'ok';
$output['status']['description'] = 'success';
$output['status']['returnedIn'] = intval((microtime(true) - $executionStartTime) * 1000) . ' MS';
$output['data'] = $decode['countryCode'];
//var_dump($decode);
header('Content-Type: application/json; charset=UTF-8');
echo json_encode($output);</pre>
<p><br /></p>