Cómo colocar marcadores en el mapa de Google


Utilizo la herramienta de mapas de Google desde primefaces. Quiero que mi usuario pueda colocar solo un marcador en un mapa. Los valores de las coordenadas deben almacenarse en variables bean gestionadas.

¿Cómo puedo hacer eso? Ver lo que hice hasta ahora:

He creado el mapa:

    <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>

También greated las variables que contendrán las coordenadas:

@ManagedBean
@RequestScoped
public class NewOfferSupportController {

private float mapLocationX;
private float mapLocationY;

//Get & set methods

Todo funciona como en las primefaces página pero tengo 2 problemas:

Problema 1: Una vez que el marcador es colocado, no se puede colocar de nuevo.

Problema 2: En la misma forma donde está el mapa hay algunos otros elementos como campos de texto. Noté que la validación no ocurre cuando hago clic en el botón enviar ubicado en el formulario donde está el mapa, En realidad el formulario no se envía en absoluto(Esto no ocurrió antes de que agregara el mapa), ¿por qué el mapa interrumpe la validación? introduzca la descripción de la imagen aquí

Author: Cœur, 2011-04-30

1 answers

Problema 1: Una vez colocado el marcador, no se puede volver a colocar.

Este problema es causado por las siguientes cosas:

  1. Has enlazado latitud y longitud a un bean (NewOfferSupportController) diferente al bean que contiene el modelo de mapa (MapBean). Deberías usar MapBean ejemplo en el escaparate PrimeFaces como punto de partida de diseño para NewOfferSupportController bean. Es decir, almacena el conjunto de marcadores. Las entradas ocultas deben apuntar a ese frijol porque en el addMarker() método se añadirán esos valores. Desde el ejemplo showcase solo tiene que cambiar el nombre de la clase MapBean y cambiar el nombre de las referencias #{mapBean} en la vista por #{newOfferSupportController}.

  2. Su NewOfferSupportController bean tiene un ámbito de solicitud mientras que debería tener un ámbito de vista.

    @ManagedBean
    @ViewScoped
    public class NewOfferSupportController implements Serializable {}
    

    Vea los frijoles con alcance en vivo mientras interactúe con la misma forma de Ajax. Pero solicitar frijoles scoped se recrean en cada solicitud (y por lo tanto también en cada solicitud Ajax!), por la presente destrozando los marcadores que se colocan antes en el mapa y las entradas que se introducen antes de añadir marcadores.


Problema 2: En la misma forma donde está el mapa hay algunos otros elementos como campos de texto. En realidad, el formulario no se envía en absoluto (Esto no ocurrió antes de agregar el mapa), ¿por qué el mapa interrumpe la validación?

Esto funciona para mí. Esto probablemente se debe a que su NewOfferSupportController se ha colocado en el ámbito de la solicitud en lugar del ámbito de la vista.

Para recapitular, aquí está el código que usé en mi prueba:{[18]]}

Vista:

<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>  

(No cambié el código <script> en el ejemplo de showcase, simplemente añádelo sin cambios)

Bean:

@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
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-13 15:59:55