banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

GeoDataDays 2025

#1 Tue 20 April 2010 17:01

fraiddo
Juste Inscrit !
Date d'inscription: 20 Apr 2010
Messages: 9

Openlayers: ombres des marqueurs

Bonjour,

J'ai vu sur cette page http://openlayers.org/dev/examples/marker-shadow.html qu'on pouvait ajouter des ombres

Le javascript utilisé est

Code:

        var SHADOW_Z_INDEX = 10;
        var MARKER_Z_INDEX = 11;
        
        var DIAMETER = 200;
        var NUMBER_OF_FEATURES = 15;
            
        var map, layer;   
            
        function init() {
            map = new OpenLayers.Map("map");
            
            layer = new OpenLayers.Layer.Vector(
                "Marker Drop Shadows",
                {
                    styleMap: new OpenLayers.StyleMap({
                        // Set the external graphic and background graphic images.
                        externalGraphic: "../img/marker-gold.png",
                        backgroundGraphic: "./marker_shadow.png",
                        
                        // Makes sure the background graphic is placed correctly relative
                        // to the external graphic.
                        backgroundXOffset: 0,
                        backgroundYOffset: -7,
                        
                        // Set the z-indexes of both graphics to make sure the background
                        // graphics stay in the background (shadows on top of markers looks
                        // odd; let's not do that).
                        graphicZIndex: MARKER_Z_INDEX,
                        backgroundGraphicZIndex: SHADOW_Z_INDEX,
                        
                        pointRadius: 10
                    }),
                    isBaseLayer: true,
                    rendererOptions: {yOrdering: true}
                }
            );
            
            map.addLayers([layer]);
            
            // Add a drag feature control to move features around.
            var dragFeature = new OpenLayers.Control.DragFeature(layer);
            
            map.addControl(dragFeature);
            
            dragFeature.activate();
                        
            map.zoomToMaxExtent();
            
            drawFeatures();
        }
        
        function drawFeatures() {
            
            layer.removeFeatures(layer.features);
            
            // Create features at random around the center.
            var center = map.getViewPortPxFromLonLat(map.getCenter());
            
            // Add the ordering features. These are the gold ones that all have the same z-index
            // and succomb to y-ordering.
            var features = [];
            
            for (var index = 0; index < NUMBER_OF_FEATURES; index++) {
                // Calculate a random x/y. Subtract half the diameter to make some
                // features negative.
                var x = (parseInt(Math.random() * DIAMETER)) - (DIAMETER / 2);
                var y = (parseInt(Math.random() * DIAMETER)) - (DIAMETER / 2);
                
                var pixel = new OpenLayers.Pixel(center.x + x, center.y + y);
                
                var lonLat = map.getLonLatFromViewPortPx(pixel);
                features.push(
                    new OpenLayers.Feature.Vector(
                        new OpenLayers.Geometry.Point(lonLat.lon, lonLat.lat)
                    )
                );
            }
            
            layer.addFeatures(features);
        }

Je m'en suis inspiré et j'ai voulu adapter (j'utilise deux fichier xml dont les marqueurs sont des icones différentes):

Code:

var map;

var SHADOW_Z_INDEX = 10;
var MARKER_Z_INDEX = 11;

//Init.
function init() {
    // Start position for the map (hardcoded here for simplicity, but maybe you want to get from URL params)
    var lat=46.5
    var lon=2.5
    var zoom=5
    var markers;
    var layer;
    var layerMapnik;
    var popup;

    // ICONS STYLE
    var size = new OpenLayers.Size(12,20);
    var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);

    map = new OpenLayers.Map ("map", {
            controls:[
                new OpenLayers.Control.Navigation({zoomWheelEnabled: false}),
                new OpenLayers.Control.PanZoomBar(),
                new OpenLayers.Control.ArgParser(),
                new OpenLayers.Control.LayerSwitcher(),
                new OpenLayers.Control.ScaleLine(),
                new OpenLayers.Control.Permalink("permalink"),
                new OpenLayers.Control.MousePosition(),
                new OpenLayers.Control.Attribution()],
            numZoomLevels:6,
            projection:new OpenLayers.Projection('EPSG:4326'),
            displayProjection:new OpenLayers.Projection('EPSG:4326'),
            maxResolution: 156543.0399,
            units: 'm'
        } );

    // Define the map layer
    layerMapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik", 

                {
                    styleMap: new OpenLayers.StyleMap({
                        backgroundGraphic: "mm_20_shadow.png",
                        backgroundXOffset: 0,
                        backgroundYOffset: -7,
                        graphicZIndex: MARKER_Z_INDEX,
                        backgroundGraphicZIndex: SHADOW_Z_INDEX,
                        pointRadius: 10
                    }),
                    rendererOptions: {yOrdering: true}
                }

);
    map.addLayer(layerMapnik);

    // Center definition
    var lonLat = new OpenLayers.LonLat(lon, lat).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());
    map.setCenter (lonLat, zoom);

    // GULLS OK XML
    var gullsok = new OpenLayers.Icon("mm_20_green.png", size, offset);
    var xmlgullsok = new OpenLayers.Layer.GeoRSS( 'GULL xmlisés', 'list_gulls_ok.php', {'icon':gullsok});
    xmlgullsok.popupSize = new OpenLayers.Size(150,70);
    map.addLayer(xmlgullsok);

    // GULLS NOK XML
    var gullsnok = new OpenLayers.Icon("mm_20_red.png", size, offset);
    var xmlgullsnok = new OpenLayers.Layer.GeoRSS( 'GULL non xmlisés', 'list_gulls_nok.php', {'icon':gullsnok});
    xmlgullsnok.popupSize = new OpenLayers.Size(150,70);
    map.addLayer(xmlgullsnok);

/* ONLOAD */
}
window.onload=init;

Mais cela ne fonctionne pas: je n'ai pas d'ombre aux marqueurs... Avant l'ajout de

Code:

                {
                    styleMap: new OpenLayers.StyleMap({
                        backgroundGraphic: "mm_20_shadow.png",
                        backgroundXOffset: 0,
                        backgroundYOffset: -7,
                        graphicZIndex: MARKER_Z_INDEX,
                        backgroundGraphicZIndex: SHADOW_Z_INDEX,
                        pointRadius: 10
                    }),
                    rendererOptions: {yOrdering: true}
                }

il n'y avait pas d'erreur.


Quelle est la bonne méthode pour ajouter des ombres quand on utilise des marqueurs différents ? (mais même icone d'ombre)

++

Hors ligne

 

#2 Mon 26 April 2010 15:01

fraiddo
Juste Inscrit !
Date d'inscription: 20 Apr 2010
Messages: 9

Re: Openlayers: ombres des marqueurs

personne ? sad

Hors ligne

 

#3 Mon 26 April 2010 15:33

pgiraud
Juste Inscrit !
Date d'inscription: 24 Jun 2009
Messages: 6

Re: Openlayers: ombres des marqueurs

Bonjour,

Il y a plusieurs problèmes dans votre démarche.

Tout d'abord, l'endroit où vous ajoutez l'option stylemap n'est pas bon.
Apparemment, vous passez cette option à une Layer de type OSM.Mapnik. C'est une couche raster (au même titre que les layers WMS). Je ne suis pas certain que ce soit sur cette couche que vous vouliez appliquer votre style.

Vous avez certainement souhaité le faire sur vos deux couches GeoRSS.
Or manque de bol, la classe OpenLayers.Layer.GeoRSS n'hérite pas de la classe OpenLayers.Layer.Vector. Vous ne pourrez donc pas utiliser votre StyleMap et la propriété backgroundGraphic associée avec une layer GeoRSS.

Cordialement,

Hors ligne

 

#4 Mon 26 April 2010 18:20

fraiddo
Juste Inscrit !
Date d'inscription: 20 Apr 2010
Messages: 9

Re: Openlayers: ombres des marqueurs

Bonjour,

si je comprends bien un layer georss ne supporte pas les ombres sur icônes ?

J'ai repris mon code à zéro et décidé d'utiliser un unique layer Text : http://www.trouvetongull.info/recenseme … p-index.js

Si je comprends bien il faut une couche spéciale pour les ombres ?

++

Dernière modification par fraiddo (Mon 26 April 2010 18:59)

Hors ligne

 

Pied de page des forums

Copyright Association GeoRezo