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.


Zobrazeno 7 zpráv z 7.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
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.