Comment placer des marqueurs sur google map

- je utiliser la carte google outil de primefaces. Je veux que mon utilisateur puisse placer un seul marqueur sur une carte. Les valeurs des coordonnées doivent être stockées dans une variable Bean gérée.

Comment puis-je faire ça? Voir ce que j'ai fait jusqu'à présent:

J'ai créé la carte:

    <f:view contentType="text/html">
            <p:gmap id="gmap" center="36.890257,30.707417" zoom="13" type="HYBRID"   
    style="width:600px;height:400px"  
    model="#{mapBean.emptyModel}"   
    onPointClick="handlePointClick(event);"   
    widgetVar="map" />  </f:view>

<p:dialog widgetVar="dlg" effect="FADE" effectDuration="0.5" close="false" fixedCenter="true">  
    <h:form prependId="false">  
        <h:panelGrid columns="2">  
            <h:outputLabel for="title" value="Title:" />  
            <p:inputText id="title" value="#{mapBean.title}" />  

            <f:facet name="footer">  
                <p:commandButton value="Add"   
                        actionListener="#{mapBean.addMarker}"   
                        update="messages"   
                        oncomplete="markerAddComplete()"/>  
                <p:commandButton value="Cancel" onclick="return cancel()"/>  
            </f:facet>  
        </h:panelGrid>  

        <h:inputHidden id="lat" value="#{newOfferSupportController.mapLocationX}" />  
        <h:inputHidden id="lng" value="#{newOfferSupportController.mapLocationY}" />  
    </h:form>  
</p:dialog>  

<script type="text/javascript">  
    var currentMarker = null;  

    function handlePointClick(event) {  
        if(currentMarker == null) {  
            document.getElementById('lat').value = event.latLng.lat();  
            document.getElementById('lng').value = event.latLng.lng();  

            currentMarker = new google.maps.Marker({  
                position:new google.maps.LatLng(event.latLng.lat(), event.latLng.lng())  
            });  

            map.addOverlay(currentMarker);  

            dlg.show();  
        }     
    }  

    function markerAddComplete() {  
        var title = document.getElementById('title');  
        currentMarker.setTitle(title.value);  
        title.value = "";  

        currentMarker = null;  
        dlg.hide();  
    }  

    function cancel() {  
        dlg.hide();  
        currentMarker.setMap(null);  
        currentMarker = null;  

        return false;  
    }  
</script>

J'ai également accueillis les variables qui contiendront les coordonnées:

@ManagedBean
@RequestScoped
public class NewOfferSupportController {

private float mapLocationX;
private float mapLocationY;

//Get & set methods

Tout fonctionne comme dans la page primefaces mais j'ai 2 Problèmes:

Problème 1: Une fois que le marqueur est placé, il ne peut pas être placé à nouveau.

Problème 2: dans la même forme où se trouve la carte, il y a d'autres éléments tels que des champs de texte. J'ai remarqué que la validation ne se produit pas lorsque je clique sur le bouton Soumettre situé dans le formulaire où se trouve la carte, en fait le formulaire n'est pas soumis du tout(cela ne s'est pas produit avant d'ajouter la carte), pourquoi la carte perturbe-t-elle la validation? entrez la description de l'image ici

26
demandé sur Cœur 2011-04-30 13:19:55

1 réponses

Problème 1: Une fois le marqueur placé, il ne peut pas être placé à nouveau.

Ce problème est causé par les choses suivantes:

  1. Vous avez lié la latitude et la longitude à un bean différent (NewOfferSupportController) que le bean qui contient le modèle de carte (MapBean). Vous devriez utiliser MapBean Exemple dans la vitrine PrimeFaces comme point de départ de conception pour NewOfferSupportController bean. Il stocke à savoir l'ensemble des marqueurs. Les entrées cachées doivent pointer vers ce bean car dans le addMarker() méthode ces valeurs seront ajoutées. Dans l'exemple showcase, il vous suffit de renommer le nom de la classe MapBean et de renommer les références #{mapBean} dans la vue par #{newOfferSupportController}.

  2. Votre bean NewOfferSupportController est à portée de requête alors qu'il devrait être à portée de vue.

    @ManagedBean
    @ViewScoped
    public class NewOfferSupportController implements Serializable {}
    

    Voir les beans de portée vivent aussi longtemps que vous interagissez avec le même formulaire par Ajax. Mais les beans à portée de requête sont recréés à chaque requête (et donc aussi à chaque requête Ajax!), détruisant par la présente les marqueurs qui sont placés avant dans la carte et les entrées qui sont entrées avant d'ajouter des marqueurs.


problème 2: dans la même forme où se trouve la carte, il y a d'autres éléments tels que des champs de texte. En fait, le formulaire n'est pas soumis du tout(cela ne s'est pas produit avant que j'ajoute la carte), pourquoi la carte perturbe-t-elle la validation?

Ça marche pour moi. Cela est probablement dû au fait que votre NewOfferSupportController a été placé dans la portée de la requête au lieu de la portée de la vue.

, Pour récapituler, voici le code que j'ai utilisé dans mon test:

Vue:

<p:growl id="messages" showDetail="true" />  

<h:form>
    <p:gmap id="gmap" center="36.890257,30.707417" zoom="13" type="HYBRID" style="width:600px;height:400px"  
        model="#{mapBean.mapModel}" onPointClick="handlePointClick(event);" widgetVar="map" />
    <h:inputText value="#{mapBean.input}" required="true" />
    <p:commandButton value="submit" action="#{mapBean.submit}" update="messages" />
</h:form>

<p:dialog widgetVar="dlg" effect="FADE" effectDuration="0.5" close="false" fixedCenter="true">  
    <h:form prependId="false">  
        <h:panelGrid columns="2">  
            <h:outputLabel for="title" value="Title:" />  
            <p:inputText id="title" value="#{mapBean.title}" />  

            <f:facet name="footer">  
                <p:commandButton value="Add" actionListener="#{mapBean.addMarker}"   
                    update="messages" oncomplete="markerAddComplete()"/>  
                <p:commandButton value="Cancel" onclick="return cancel()"/>  
            </f:facet>
        </h:panelGrid>

        <h:inputHidden id="lat" value="#{mapBean.lat}" />  
        <h:inputHidden id="lng" value="#{mapBean.lng}" />
    </h:form>  
</p:dialog>  

(Je n'ai pas changé le code <script> dans l'exemple showcase, il suffit de l'ajouter inchangé)

Haricot:

@ManagedBean
@ViewScoped
public class MapBean implements Serializable {  

    private MapModel mapModel;  
    private String title;  
    private double lat;  
    private double lng;  
    private String input;

    public MapBean() {  
        mapModel = new DefaultMapModel();  
    }  

    public void addMarker(ActionEvent actionEvent) {  
        mapModel.addOverlay(new Marker(new LatLng(lat, lng), title));  
        addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "Marker Added", "Lat:" + lat + ", Lng:" + lng));  
    }  

    public void submit() {
        addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "Form submitted", "Amount markers: " + mapModel.getMarkers().size() + ", Input: " + input));
    }

    public void addMessage(FacesMessage message) {  
        FacesContext.getCurrentInstance().addMessage(null, message);  
    }  

    // Getters+setters.
}
6
répondu BalusC 2011-06-13 15:59:55