[Gfoss] Openlayers 4: Popup sulle feature

Buondì, sto cercando di mostrare al click su una feature un popup con i dati
tabellari della feature selezionata.

Purtroppo non riesco a far comparire il popup sulla feature e nemmeno a
chiuderlo. Compare in basso a sinistra come vedete dall'immagine. Come posso
farlo comparire nella giusta posizione? In Leaflet i popup sono molto più
semplici da gestire e configurare, in OL li ho sempre trovati molto ostici
ed alla fine ho sempre ripiegato sul sidebar ma ora mi serve un popup.

Su GIST ho caricato il codice che ho usato[0] e qui[1] trovate il geojson da
cui attingere le informazioni.

<http://gfoss-geographic-free-and-open-source-software-italian-mailing.3056002.n2.nabble.com/file/t395848/Schermata_del_2018-06-02_19-44-50.png&gt;
PS: non fate caso ai dati null, mancano ed il risultato è corretto

______________-
[0] https://gist.github.com/MaxDragonheart/9c383c4d08dfdd0d86018778a1e77f45
[1] http://massimilianomoraca.it/download/test/edificato.geojson

-----
Ingegnere, consulente GIS e ciclista urbano
--
Sent from: http://gfoss-geographic-free-and-open-source-software-italian-mailing.3056002.n2.nabble.com/

Proprio questo esempio ho usato, come puoi vedere anche dal codice
allegato. Ma il popup non va dove deve ed anche per questo ho allegato il
codice così magari se c'è un errore me lo fate notare...

2018-06-03 12:09 GMT+02:00 Tiscali <umbertofilippo@tiscali.it>:

http://openlayers.org/en/latest/examples/popup.html

Suppongo sia legato a un problema di coorindate.

probabilmente devi trasformare le coordinate di pixel nel sistema giusto.

solo un suggerimento, dato che non riesco a darti supporto più specifico.

Starei attento all’ultima parte dell’esempio linkato, dove si fa una trasformazione:

      /**

      * Add a click handler to the map to render the popup.

       */

      map.on('singleclick', function(evt) {

        var coordinate = evt.coordinate;

        var hdms = ol.coordinate.toStringHDMS(ol.proj.transform(

            coordinate, 'EPSG:3857', 'EPSG:4326'));

        content.innerHTML = '<p>You clicked here:</p><code>' + hdms +

            '</code>';

        overlay.setPosition(coordinate);

      });

Da: Massimiliano Moraca <massimilianomoraca@gmail.com>
Inviato: domenica 3 giugno 2018 13:04
A: Tiscali <umbertofilippo@tiscali.it>
Cc: GFOSS.it <gfoss@lists.gfoss.it>
Oggetto: Re: [Gfoss] Openlayers 4: Popup sulle feature

Proprio questo esempio ho usato, come puoi vedere anche dal codice allegato. Ma il popup non va dove deve ed anche per questo ho allegato il codice così magari se c'è un errore me lo fate notare...

2018-06-03 12:09 GMT+02:00 Tiscali <umbertofilippo@tiscali.it <mailto:umbertofilippo@tiscali.it> >:

http://openlayers.org/en/latest/examples/popup.html

no, scusa, non c’entra, ci riguardo e se capisco meglio ti dico :blush:

-----Messaggio originale-----
Da: Gfoss <gfoss-bounces@lists.gfoss.it> Per conto di umbertofilippo@tiscali.it
Inviato: lunedì 4 giugno 2018 12:31
A: 'Massimiliano Moraca' <massimilianomoraca@gmail.com>
Cc: 'GFOSS.it' <gfoss@lists.gfoss.it>
Oggetto: [Gfoss] R: Openlayers 4: Popup sulle feature

Suppongo sia legato a un problema di coorindate.

probabilmente devi trasformare le coordinate di pixel nel sistema giusto.

solo un suggerimento, dato che non riesco a darti supporto più specifico.

Starei attento all’ultima parte dell’esempio linkato, dove si fa una trasformazione:

      /**

      * Add a click handler to the map to render the popup.

       */

      map.on('singleclick', function(evt) {

        var coordinate = evt.coordinate;

        var hdms = ol.coordinate.toStringHDMS(ol.proj.transform(

            coordinate, 'EPSG:3857', 'EPSG:4326'));

        content.innerHTML = '<p>You clicked here:</p><code>' + hdms +

            '</code>';

        overlay.setPosition(coordinate);

      });

Da: Massimiliano Moraca < <mailto:massimilianomoraca@gmail.com> massimilianomoraca@gmail.com>

Inviato: domenica 3 giugno 2018 13:04

A: Tiscali < <mailto:umbertofilippo@tiscali.it> umbertofilippo@tiscali.it>

Cc: GFOSS.it < <mailto:gfoss@lists.gfoss.it> gfoss@lists.gfoss.it>

Oggetto: Re: [Gfoss] Openlayers 4: Popup sulle feature

Proprio questo esempio ho usato, come puoi vedere anche dal codice allegato. Ma il popup non va dove deve ed anche per questo ho allegato il codice così magari se c'è un errore me lo fate notare...

2018-06-03 12:09 GMT+02:00 Tiscali < <mailto:umbertofilippo@tiscali.it%20%3cmailto:umbertofilippo@tiscali.it> umbertofilippo@tiscali.it <mailto:umbertofilippo@tiscali.it> >:

<http://openlayers.org/en/latest/examples/popup.html&gt; http://openlayers.org/en/latest/examples/popup.html

_______________________________________________

<mailto:Gfoss@lists.gfoss.it> Gfoss@lists.gfoss.it

<http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss&gt; http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss

Questa e' una lista di discussione pubblica aperta a tutti.

I messaggi di questa lista non hanno relazione diretta con le posizioni dell'Associazione GFOSS.it.

796 iscritti al 28/12/2017

Ciao ok, grazie :slight_smile:

Il lun 4 giu 2018, 12:37 <umbertofilippo@tiscali.it> ha scritto:

no, scusa, non c’entra, ci riguardo e se capisco meglio ti dico :blush:

-----Messaggio originale-----
Da: Gfoss <gfoss-bounces@lists.gfoss.it> Per conto di
umbertofilippo@tiscali.it
Inviato: lunedì 4 giugno 2018 12:31
A: 'Massimiliano Moraca' <massimilianomoraca@gmail.com>
Cc: 'GFOSS.it' <gfoss@lists.gfoss.it>
Oggetto: [Gfoss] R: Openlayers 4: Popup sulle feature

Suppongo sia legato a un problema di coorindate.

probabilmente devi trasformare le coordinate di pixel nel sistema giusto.

solo un suggerimento, dato che non riesco a darti supporto più specifico.

Starei attento all’ultima parte dell’esempio linkato, dove si fa una
trasformazione:

      /**

      * Add a click handler to the map to render the popup.

       */

      map.on('singleclick', function(evt) {

        var coordinate = evt.coordinate;

        var hdms = ol.coordinate.toStringHDMS(ol.proj.transform(

            coordinate, 'EPSG:3857', 'EPSG:4326'));

        content.innerHTML = '<p>You clicked here:</p><code>' + hdms +

            '</code>';

        overlay.setPosition(coordinate);

      });

Da: Massimiliano Moraca <massimilianomoraca@gmail.com>

Inviato: domenica 3 giugno 2018 13:04

A: Tiscali <umbertofilippo@tiscali.it>

Cc: GFOSS.it <gfoss@lists.gfoss.it>

Oggetto: Re: [Gfoss] Openlayers 4: Popup sulle feature

Proprio questo esempio ho usato, come puoi vedere anche dal codice
allegato. Ma il popup non va dove deve ed anche per questo ho allegato il
codice così magari se c'è un errore me lo fate notare...

2018-06-03 12:09 GMT+02:00 Tiscali <umbertofilippo@tiscali.it
<mailto:umbertofilippo@tiscali.it> >:

http://openlayers.org/en/latest/examples/popup.html

_______________________________________________

Gfoss@lists.gfoss.it

http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss

Questa e' una lista di discussione pubblica aperta a tutti.

I messaggi di questa lista non hanno relazione diretta con le posizioni
dell'Associazione GFOSS.it.

796 iscritti al 28/12/2017

cosi' funziona.

suppongo che il problema fosse: 1) non gestisci mai ol.Overlay (non lo chiami, vedi esempio ufficiale ol); 2) non gestisci la chiusura (ci sono sia il css che l'html ma manca la parte js)

fammi sapere se hai problemi, ciao!

   /\*\*
    \* Elements that make up the popup\.
    \*/
   var container = document\.getElementById\(&#39;popup&#39;\);
   var content = document\.getElementById\(&#39;popup\-content&#39;\);
   var closer = document\.getElementById\(&#39;popup\-closer&#39;\);

   var maxExtent = \[14\.068, 40\.911, 14\.2339, 41\.0039\];
   var boundary = ol\.proj\.transformExtent\(maxExtent, &#39;EPSG:4326&#39;, &#39;EPSG:3857&#39;\);
   var center = ol\.proj\.transform\(\[14\.15, 40\.95\], &#39;EPSG:4326&#39;, &#39;EPSG:3857&#39;\);

   /\*\*
    \* Create an overlay to anchor the popup to the map\.
    \*/
   var overlay = new ol\.Overlay\(\{
       element: container,
       autoPan: true,
       autoPanAnimation: \{
           duration: 250
       \}
   \}\);

   /\*\*
    \* Add a click handler to hide the popup\.
    \* @return \{boolean\} Don&#39;t follow the href\.
    \*/
   closer\.onclick = function\(\) \{
       overlay\.setPosition\(undefined\);
       closer\.blur\(\);
       return false;
   \};

   var edificato = new ol\.layer\.Vector\(\{
       title: &#39;Edificato&#39;,
       source: new ol\.source\.Vector\(\{
           url: &#39;https://cors-anywhere.herokuapp.com/http://massimilianomoraca.it/download/test/edificato.geojson',
           format: new ol\.format\.GeoJSON\(\),
       \}\),
       zIndex: 1
   \}\);

   var displayFeatureInfo = function\(pixel\) \{
       var feature = map\.forEachFeatureAtPixel\(pixel, function\(feature\) \{
           return feature;
       \}\);
       var info = document\.getElementById\(&#39;popup\-content&#39;\);
       if \(feature\) \{
           info\.innerHTML =
               &#39;&lt;div&gt;&#39; \+ &#39;&lt;table&gt;&#39; \+ &#39;&lt;thead&gt;&lt;td scope=&quot;row&quot; align=&quot;center&quot; colspan=&quot;2&quot;&gt;Informazioni&lt;/td&gt;&lt;/thead&gt;&#39; \+ &#39;&lt;tbody&gt;&#39; \+ &#39;&lt;tr&gt;&lt;th scope=&quot;row&quot; align=&quot;left&quot; colspan=&quot;1&quot;&gt;Destinazione d\\&#39;uso: &lt;/th&gt;&lt;td colspan=&quot;1&quot; align=&quot;right&quot;&gt;&#39; \+ feature\.get\(&#39;dest\_uso&#39;\) \+ &#39;&lt;/td&gt;&lt;/tr&gt;&#39; \+ &#39;&lt;tr&gt;&lt;th scope=&quot;row&quot; align=&quot;left&quot; colspan=&quot;1&quot;&gt;Altezza stimata: &lt;/th&gt;&lt;td colspan=&quot;1&quot; align=&quot;right&quot;&gt;&#39; \+ feature\.get\(&#39;altezza&#39;\) \+ &#39; m&lt;/td&gt;&lt;/tr&gt;&#39; \+ &#39;&lt;tr&gt;&lt;th scope=&quot;row&quot; align=&quot;left&quot; colspan=&quot;1&quot;&gt;Volume stimato: &lt;/th&gt;&lt;td colspan=&quot;1&quot; align=&quot;right&quot;&gt;&#39; \+ feature\.get\(&#39;volume&#39;\) \+ &#39; m&lt;sup&gt;3&lt;/sup&gt;&lt;/td&gt;&lt;/tr&gt;&#39; \+ &#39;&lt;/tbody&gt;&#39; \+ &#39;&lt;/table&gt;&#39; \+ &#39;&lt;/div&gt;&#39;;
       \} else \{
           info\.innerHTML = &#39;Clicca su un poligono per leggere le statistiche&#39;;
       \}
   \};

   /\*\*
    \* Create the map\.
    \*/
   var map = new ol\.Map\(\{
       layers: \[
           new ol\.layer\.Tile\(\{
               source: new ol\.source\.TileJSON\(\{
                   url: &#39;https://api.tiles.mapbox.com/v3/mapbox.natural-earth-hypso-bathy.json?secure',
                   crossOrigin: &#39;anonymous&#39;
               \}\)
           \}\),
           edificato
       \],
       overlays: \[overlay\],
       target: &#39;map&#39;,
       view: new ol\.View\(\{
           extent: boundary,
           center: center,
           zoom: 2,
           maxZoom: 20,
           minZoom: 14,
       \}\)
   \}\);

   /\*\*
    \* Add a click handler to the map to render the popup\.
    \*/
   map\.on\(&#39;singleclick&#39;, function\(evt\) \{
       var coordinate = evt\.coordinate;
       displayFeatureInfo\(evt\.pixel\);
       overlay\.setPosition\(coordinate\);
   \}\);

On 04/06/2018 13:18, Massimiliano Moraca wrote:

Ciao ok, grazie :slight_smile:

Il lun 4 giu 2018, 12:37 <umbertofilippo@tiscali.it <mailto:umbertofilippo@tiscali.it>> ha scritto:

    no, scusa, non c’entra, ci riguardo e se capisco meglio ti dico :blush:

    -----Messaggio originale-----
    Da: Gfoss <gfoss-bounces@lists.gfoss.it
    <mailto:gfoss-bounces@lists.gfoss.it>> Per conto di
    umbertofilippo@tiscali.it <mailto:umbertofilippo@tiscali.it>
    Inviato: lunedì 4 giugno 2018 12:31
    A: 'Massimiliano Moraca' <massimilianomoraca@gmail.com
    <mailto:massimilianomoraca@gmail.com>>
    Cc: 'GFOSS.it' <gfoss@lists.gfoss.it <mailto:gfoss@lists.gfoss.it>>
    Oggetto: [Gfoss] R: Openlayers 4: Popup sulle feature

    Suppongo sia legato a un problema di coorindate.

    probabilmente devi trasformare le coordinate di pixel nel sistema
    giusto.

    solo un suggerimento, dato che non riesco a darti supporto più
    specifico.

    Starei attento all’ultima parte dell’esempio linkato, dove si fa
    una trasformazione:

     /**

     * Add a click handler to the map to render the popup.

     */

    map.on('singleclick', function(evt) {

     var coordinate = evt.coordinate;

     var hdms = ol.coordinate.toStringHDMS(ol.proj.transform(

    coordinate, 'EPSG:3857', 'EPSG:4326'));

    content.innerHTML = '<p>You clicked here:</p><code>' + hdms +

    '</code>';

    overlay.setPosition(coordinate);

     });

    Da: Massimiliano Moraca <massimilianomoraca@gmail.com
    <mailto:massimilianomoraca@gmail.com>>

    Inviato: domenica 3 giugno 2018 13:04

    A: Tiscali <umbertofilippo@tiscali.it
    <mailto:umbertofilippo@tiscali.it>>

    Cc: GFOSS.it <gfoss@lists.gfoss.it <mailto:gfoss@lists.gfoss.it>>

    Oggetto: Re: [Gfoss] Openlayers 4: Popup sulle feature

    Proprio questo esempio ho usato, come puoi vedere anche dal codice
    allegato. Ma il popup non va dove deve ed anche per questo ho
    allegato il codice così magari se c'è un errore me lo fate notare...

    2018-06-03 12:09 GMT+02:00 Tiscali <umbertofilippo@tiscali.it
    <mailto:umbertofilippo@tiscali.it
    <mailto:umbertofilippo@tiscali.it%20%3cmailto:umbertofilippo@tiscali.it>>
    >:

    http://openlayers.org/en/latest/examples/popup.html

    _______________________________________________

    Gfoss@lists.gfoss.it <mailto:Gfoss@lists.gfoss.it>

    http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss

    Questa e' una lista di discussione pubblica aperta a tutti.

    I messaggi di questa lista non hanno relazione diretta con le
    posizioni dell'Associazione GFOSS.it.

    796 iscritti al 28/12/2017

Ciao si funziona, grazie :slight_smile:

Al di là del fatto che non facessi uso di ol.overlay ho visto che sbagliavo
anche ad impostare il map.on.

Se uso tutto il codice in un solo file html funziona ma se cerco di ricreare
la struttura dei miei progetti no. Ti allego una immagine che riassume come
gestisco le webmap
<http://gfoss-geographic-free-and-open-source-software-italian-mailing.3056002.n2.nabble.com/file/t395848/schema.png&gt;

Quando cerco di riprodurla inserendo il popup(parte in verde) nel momento in
cui clicco mi compare il messaggio
"TypeError: map.on is not a function[Learn More] popup.js:53:1
<anonymous>
http://localhost/dev/OpenLayers4/In_sviluppo/parete/webmap/test/js/popup.js:53:1
"

La webmap funziona bene a parte il fatto che non compare il popup. Secondo
te dove sbaglio?

-----
Ingegnere, consulente GIS e ciclista urbano
--
Sent from: http://gfoss-geographic-free-and-open-source-software-italian-mailing.3056002.n2.nabble.com/

Forse il codice del popup viene caricato PRIMA del codice della map?

Amefad

Il giorno 5 giugno 2018 10:16, Massimiliano Moraca <
massimilianomoraca@gmail.com> ha scritto:

Ciao si funziona, grazie :slight_smile:

Al di là del fatto che non facessi uso di ol.overlay ho visto che sbagliavo
anche ad impostare il map.on.

Se uso tutto il codice in un solo file html funziona ma se cerco di
ricreare
la struttura dei miei progetti no. Ti allego una immagine che riassume come
gestisco le webmap
<http://gfoss-geographic-free-and-open-source-software-
italian-mailing.3056002.n2.nabble.com/file/t395848/schema.png>

Quando cerco di riprodurla inserendo il popup(parte in verde) nel momento
in
cui clicco mi compare il messaggio
"TypeError: map.on is not a function[Learn More] popup.js:53:1
<anonymous>
http://localhost/dev/OpenLayers4/In_sviluppo/parete/webmap/test/js/popup.
js:53:1
"

La webmap funziona bene a parte il fatto che non compare il popup. Secondo
te dove sbaglio?

-----
Ingegnere, consulente GIS e ciclista urbano
--
Sent from: http://gfoss-geographic-free-and-open-source-software-
italian-mailing.3056002.n2.nabble.com/
_______________________________________________
Gfoss@lists.gfoss.it
http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non hanno relazione diretta con le posizioni
dell'Associazione GFOSS.it.
796 iscritti al 28/12/2017

suppongo proprio che il problema stia nel fatto che nel codice che chiami "popup.js" ci sia una variabile chiamata "map" che non è mai stata dichiarata in quel codice, ma solo nel "main.js".
Dovresti a mio avviso togliere il map.on dal popup.js e gestirlo dal main.js

-----Messaggio originale-----
Da: Gfoss <gfoss-bounces@lists.gfoss.it> Per conto di Massimiliano Moraca
Inviato: martedì 5 giugno 2018 10:16
A: gfoss@lists.gfoss.it
Oggetto: Re: [Gfoss] R: Openlayers 4: Popup sulle feature

Ciao si funziona, grazie :slight_smile:

Al di là del fatto che non facessi uso di ol.overlay ho visto che sbagliavo anche ad impostare il map.on.

Se uso tutto il codice in un solo file html funziona ma se cerco di ricreare la struttura dei miei progetti no. Ti allego una immagine che riassume come gestisco le webmap <http://gfoss-geographic-free-and-open-source-software-italian-mailing.3056002.n2.nabble.com/file/t395848/schema.png&gt;

Quando cerco di riprodurla inserendo il popup(parte in verde) nel momento in cui clicco mi compare il messaggio
"TypeError: map.on is not a function[Learn More] popup.js:53:1 <anonymous>
http://localhost/dev/OpenLayers4/In_sviluppo/parete/webmap/test/js/popup.js:53:1
"

La webmap funziona bene a parte il fatto che non compare il popup. Secondo te dove sbaglio?

-----
Ingegnere, consulente GIS e ciclista urbano
--
Sent from: http://gfoss-geographic-free-and-open-source-software-italian-mailing.3056002.n2.nabble.com/
_______________________________________________
Gfoss@lists.gfoss.it
http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non hanno relazione diretta con le posizioni dell'Associazione GFOSS.it.
796 iscritti al 28/12/2017

Si ci avevo provato portando quel blocco con map.on infondo a main.js ma al
click sulla geometria mi compare questo errore:

"
TypeError: info is null[Learn More] popup.js:42:82
displayFeatureInfo
http://localhost/dev/OpenLayers4/In_sviluppo/parete/webmap/test/js/popup.js:42:82
<anonymous>
http://localhost/dev/OpenLayers4/In_sviluppo/parete/webmap/test/js/main.js:130:5
b
https://openlayers.org/en/v4.6.5/build/ol.js:46:348
Sc.prototype.b
https://openlayers.org/en/v4.6.5/build/ol.js:49:206
k.bi
https://openlayers.org/en/v4.6.5/build/ol.js:129:352
b
https://openlayers.org/en/v4.6.5/build/ol.js:46:348
Sc.prototype.b
https://openlayers.org/en/v4.6.5/build/ol.js:49:206
ce/a.j<
https://openlayers.org/en/v4.6.5/build/ol.js:71:882
<anonymous> self-hosted:982:17
"

La riga indicata in popup.js è quella che inizia con l'ultimo "tr" della
tabella che contiene i contenuti del popup, mentre la riga di main.js
coincide con quella di "displayFeatureInfo" di map.on

-----
Ingegnere, consulente GIS e ciclista urbano
--
Sent from: http://gfoss-geographic-free-and-open-source-software-italian-mailing.3056002.n2.nabble.com/

Piccolo aggiornamento.

Non credo che il problema del messaggio "popup is null...."(come test ho
cambiato info in popup) dipenda dal fatto che qualcosa non torna nella
distribuzione dei .js.

Ho infatti riportato tutto il contenuto dei file nella pagina html
principale ed il messaggio di errore compare lo stesso quando si clicca su
una geometria. Per il resto la webmap funziona.

Non vorrei che la problematica fosse dovuta al fatto che rispetto
all'esempio con cui ho iniziato questa discussione ho 3 geojson in più.

-----
Ingegnere, consulente GIS e ciclista urbano
--
Sent from: http://gfoss-geographic-free-and-open-source-software-italian-mailing.3056002.n2.nabble.com/