L?sen Sie ?nderungen mithilfe von Werten aus der API aus.
P粉633309801
2023-07-30 15:33:31
<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>