Fórum nápovědy

Seznam

Více značek s vizitkou na jedné adrese

Martin Truhelka

10.12.2015 v 17:40

Dobrý den,

mám více značek na jedné adrese (tj. se stejnými souřadnicemi) a každá z těchto značek má ve vizitce svůj popisek.
Problém je v tom, že při běžném vykreslení se značky navrství na sebe, takže je možné zobrazit si vizitku pouze vrchní značky a k informacím o ostatních značkách se uživatel nedostane.
Je nějak možné dosáhnout zobrazení informací (vizitek) ke všem značkám?

Zkoušel jsem
markerLayer.setReposition({})
což problém sice řeší, ale zase vzniká jiný problém - že při velkém množství nebo určitém oddálení překryjí značky třeba celé město, což pak málo vypovídá o skutečném umístění hlavních cílů.

Rovněž jsem zkoušel

var clusterer = new SMap.Marker.Clusterer(map)
markerLayer.setClusterer(clusterer)

kde je naopak skvěle vidět, kde jsou koncentrovány hlavní cíle, ovšem shluk, který obsahuje značky na stejné souřadnici, už není možné nijak rozkliknout a zobrazit tak vizitky značek.

Ideální by byla jakási kombinace setReposition a Clustereru, kde by se nejdřív (z dálky) ukazovaly shluky a při přiblížení na určitou úroveň by se značky rozmístily vedle sebe a bylo by možné dostat se k jejich vizitkám.
Předpokládám, že takováto kombinace možná není?
Bylo by možné nějak dosáhnout podobné funkčnosti? Nebo prostě nějak zajistit možnost zobrazit si vizitky u všech značek, co jsou na stejných souřadnicích?

Děkuji.

Ondřej Žára • Webmaster Guru

11.12.2015 v 8:38

Hezky den,

poslouchanim na signal "map-redraw" se dozvite, kdy doslo ke zmene zoomu. V zavislosti na tom lze repositioner i clusterer zapinat/vypinat podle potreby, potazmo pouzivat dve vrstvy (jednu s clustery, druhou s repositionerem) a stridave je zapinat a vypinat.

I posledni zminena myslenka ma neco do sebe. Znacku pro zadanou "sdilenou" souradnici vyrobite jen jednu, ale do jeji vizitky umistite informace o vsech subjektech, ktere na teto adrese (+- nejaka tolerance vzdalenosti) sidli...

Martin Truhelka

11.12.2015 v 10:46

Děkuji.

Udělal jsem to ještě před přečtením vaší odpovědi velmi podobně tomu, co píšete, tj. "map-redraw" a vypínání repositioneru/clustereru v závislosti na zoomu.


// set clustering mode depending on zoom
var isCloseView = function(zoom) { return zoom >= 17 }
var setClustering = function setClustering(closeView) {
markerLayer.setClusterer(closeView ? null : new SMap.Marker.Clusterer(map, 30))
markerLayer.setReposition(closeView ? {} : null)
}
var lastZoom = map.getZoom()
setClustering(isCloseView(lastZoom))
map.getSignals().addListener(window, "map-redraw", function(e) {
var zoom = e.target.getZoom()
if (zoom != lastZoom && isCloseView(zoom) != isCloseView(lastZoom)) { // closeView treshold crossed
setClustering(isCloseView(zoom))
}
lastZoom = zoom
})


Nenašel jsem způsob, jak v "map-redraw" zjistit odkud kam se mění zoom (abych věděl, zda přepnout repositioner/clusterer), tak jsem si musel pomoct proměnnou lastZoom. Nejde to nějak elegantněji? <!-- s:) --><img src="{SMILIES_PATH}/icon_e_smile.gif" alt=":)" title=":-)" /><!-- s:) -->

Ještě jednou díky.

Ondřej Žára • Webmaster Guru

14.12.2015 v 9:21

Nenašel jsem způsob, jak v "map-redraw" zjistit odkud kam se mění zoom (abych věděl, zda přepnout repositioner/clusterer), tak jsem si musel pomoct proměnnou lastZoom. Nejde to nějak elegantněji? <!-- s:) --><img src="{SMILIES_PATH}/icon_e_smile.gif" alt=":)" title=":-)" /><!-- s:) -->


Nejde, nebot "map-redraw" nastava mnohem casteji, nez jen pri zmene zoomu. Korektni reseni je tedy pamatovat si puvodni zoom a volanim getZoom() overovat, doslo-li k jeho zmene.

Arius 3

4.5.2016 v 18:38

Dobry den,

resim podobny problem. Me by se Vsak libilo reseni, ze kdyz kliknu na shluk a je maximlni zoom, zobrazi se vizitka s informacemi ze vsech markeru v danem shlukovaci.
Nejsem si uplne jisty, jak spravne vytvorit vlastni SMap.Marker.Cluster, ktery predam do

var clusterer = new SMap.Marker.Clusterer(m, 20, MujCluster);


pak v metode click daneho MujCluster by melo jit se zeptat na dane prvky a vytahat z nich informace k zobrazeni.

Nebo jsem neco spatne pochopil?

Dekuji
JS

Ondřej Žára • Webmaster Guru

5.5.2016 v 8:58

Hezky den,

chapete to spravne, to zni jako dobre reseni. Sel bych na to zhruba takto:


var MujCluster = JAK.ClassMaker.makeClass({
NAME: "MujCluster",
VERSION: "1.0,
EXTEND: SMap.Marker.Cluster
});

MujCluster.prototype.click = function() {
alert(this._markers.length); // vyrobit vizitku, zobrazit
}


Pokud se vam prici ta vec s ClassMaker.makeClass, lze pouzit i beznou JS dedicnost, tedy "MujCluster.prototype = Object.create(SMap.Maker.Cluster.prototype)".

Arius 3

5.5.2016 v 16:15

Tak finalni reseni a funguje to pekne:


var MujCluster = JAK.ClassMaker.makeClass({
NAME: "MujCluster",
VERSION: "1.0",
EXTEND: SMap.Marker.Cluster
});


MujCluster.prototype.click = function(e, elm) {

var max_zoom = 18;
var map = this.getMap();


if(map.getZoom() >= max_zoom){
var card = new SMap.Card();
var infos = "";

for (i = 0; i < this._markers.length; i++) {
infos += this._markers[i]._card.getBody().innerHTML + "<br>";
}

card.getBody().innerHTML = infos;
map.addCard(card, this.getCoords());

}
else
{
this.$super(e, elm);
}

}


var layer = new SMap.Layer.Marker();
var clusterer = new SMap.Marker.Clusterer(m, 20, MujCluster);
layer.setClusterer(clusterer);

Ondřej Žára • Webmaster Guru

5.5.2016 v 20:12

Tak finalni reseni a funguje to pekne:


Parada, dobra prace!

Pavel Říha

22.8.2019 v 23:42

Taky díky moc, jen bude dobré kdo máte přidat i hlavičku, třeba :

for (i = 0; i < this._markers.length; i++) {

infos += this._markers[i]._card.getHeader().innerHTML + this._markers[i]._card.getBody().innerHTML+'<br />' ;
}

a případně i this._markers[i]._card.getFooter().innerHTML ,pokud používáte.

Nový dotaz

Přiložené přílohy

    Zbývá 12MB (z 12MB)

    Více značek s vizitkou na jedné adrese

    Přiložené přílohy

      Zbývá 12MB (z 12MB)