Diskuze: Jak do mapy: Openlayers přidat více marker icon ze seznamu v php?
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 7 zpráv z 7.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Ahoj, ty jsi mi po ránu dal zabrat. Takže kde začít? Je toho hodně, čili stručně po bodech.
0a Pokud si v DB ukládáš a vracíš souřadnice v podobě "-74.0061,40.712", tak prvního problému se dopouštíš už v návrhu. Udělej si dva databázové sloupce. Jeden pro latitude a druhý pro longtitude. Jednak tím zajistíš přehlednost a jednoznačnost dat a taky můžeš nad DB dělat propočty typu "Všechny body v okruhu X kilometrů od souřadnic A, B".
0b Je to vyzobané z tutoriálu na webu, tak by pro kontext nevadilo, kdybys příště dal i odkaz na zdroj, kde jsi k tomu kódu přišel.
1 PHP se provádí a jeho výstupy vypisují před/při odesláním stránky do prohlížeče. JS provádíš až u klienta, tak se z jeho cyklu takto nemůžeš doptávat na proměnné PHP. Vše si v PHP připrav a pošli jako JS data.
<?php
$list = [];
$coords = ['-74.0061,40.712', '40.712,40.712', '19.291,50.712'];
foreach($coords as $item) {
list($lng, $lat) = explode(',', $item);
$list[] = ['lng' => $lng, 'lat' => $lat];
}
?>
<script>
window.phpdata = {};
Object.defineProperty(window.phpdata, "markers", {value: <?php echo !empty($list) ? json_encode($list) : 'null'; ?>, writable: false, configurable: false});
</script>
2 Integer je celočíselný datový typ. Žádná desetinná místa, žádná dvě čísla oddělená čárkou. Ty potřebuješ definovat dva parametry desetinného čísla.
3 Číslo v názvu proměnné tady nepotřebuješ. Více markerů se v OpenLayers dělá jiným způsobem. Ty tu proměnnou potřebuješ jen po dobu jeho nastavení (ikona, barva, akce atd.). Pak ji můžeš přepsat dalším markerem.
No a pokud jsi to dočetl až sem, tak přikládám ukázku fungující implementace https://jsfiddle.net/v6gLbhwo/
Aha, to je dobré řešení. S tím kódem z odkazu a ten
Object.defineProperty s pevně danými souřadnicemi mi to funguje, ale když
ho nahradím tím co máš zde v náhledu, který čerpá hodnoty ze seznamu,
tak se mi markery nezobrazí. (Z php to bere správně, to jsem testoval.)
(Ten object s fixními hodnotami mám zakomentářovaný a pod ním aktivní ten
co čerpá).
Tentokrát zde uvedu celý kód:
<!DOCTYPE html>
<html>
<head>
<title>Working with Openlayers</title>
<link rel="stylesheet" href="https://openlayers.org/en/v4.6.5/css/ol.css" type="text/css">
<!-- Openlayers CSS file-->
<style type="text/css">
#map{
width:100%;
height:600px;
}
</style>
<!--Basic styling for map div,
if height is not defined the div will show up with 0 px height --></head>
<body>
<?php
$conn = mysqli_connect("localhost", "root", "", "lokace");
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT souradnice FROM tabulka_lokace";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// output data of each row
$coords= array();
$variable = "";
while($name = $result->fetch_assoc()) {
array_push($coords, $name["souradnice"]."<br>");
$variable = $variable.$name["souradnice"].",";
}
} else { echo "0 results"; }
$list = [];
//$coords = ['-74.0061,40.712', '40.712,40.712', '19.291,50.712'];
foreach($coords as $item) {
list($lng, $lat) = explode(',', $item);
$list[] = ['lng' => $lng, 'lat' => $lat];
}
$conn->close();
?>
<div id="map">
</div>
</body>
<script src="https://openlayers.org/en/v4.6.5/build/ol.js" type="text/javascript"></script>
<script>
window.phpdata = {};
//Object.defineProperty(window.phpdata, "markers", {value: [{"lng":"-74.0061","lat":"40.712"},{"lng":"40.712","lat":"40.712"},{"lng":"19.291","lat":"50.712"}], writable: false, configurable: false});
Object.defineProperty(window.phpdata, "markers", {value: <?php echo !empty($list) ? json_encode($list) : 'null'; ?>, writable: false, configurable: false});
var base = new ol.layer.Tile({
source: new ol.source.OSM()
});
var map = new ol.Map({
target: 'map',
layers: [base],
view: new ol.View({
center: ol.proj.fromLonLat([-74.0061,40.712]), zoom: 2
})
});
var vectors = new ol.source.Vector({});
if(window.phpdata.markers && window.phpdata.markers.length > 0) {
var data = window.phpdata.markers;
for(var i = 0; i < data.length; i++) {
var marker = new ol.Feature({
geometry: new ol.geom.Point(
ol.proj.fromLonLat([Number(data[i].lng), Number(data[i].lat)])
),
});
marker.setStyle(new ol.style.Style({
image: new ol.style.Icon(({
src: 'https://raw.githubusercontent.com/itsmohitt/openlayers-tutorials/master/dot.png'
}))
}));
vectors.addFeature(marker);
}
var layer = new ol.layer.Vector({
source: vectors,
});
map.addLayer(layer);
}
</script>
</html>
Nevím, co jsi testoval, ale už tady vidím první chybu, kdy do toho mícháš html tagy, takže ten výstup správně být nemůže.
array_push($coords, $name["souradnice"]."<br>");
Udělej po naplnění var_dump pro $coords. Nebo ještě lépe otevři konzoli a udělej výpis console.table(window.phpdata.markers). A pokud výpis nevypadá strukturálně jako v příloze, tak si tu kontrolu udělej pořádně znovu.
Super, tak si to ještě trochu učeš. Máš to zbytečně roztahané do dvou cyklů.
$result = $conn->query($sql);
$list = [];
if ($result->num_rows > 0) {
while($name = $result->fetch_assoc()) {
list($lng, $lat) = explode(',', $name['souradnice']);
$list[] = ['lng' => $lng, 'lat' => $lat];
}
} else {
echo '0 results';
}
$conn->close();
Zobrazeno 7 zpráv z 7.