繁体   English   中英

如何在谷歌地图上放置标记

[英]How to place markers on google map

我使用来自primefaces的谷歌地图工具。 我希望我的用户能够在地图上只放置一个标记。 坐标值应存储在托管bean变量中。

我怎样才能做到这一点? 看看到目前为止我做了什么:

我创建了地图:

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

我还对包含坐标的变量进行了调整:

@ManagedBean
@RequestScoped
public class NewOfferSupportController {

private float mapLocationX;
private float mapLocationY;

//Get & set methods

这一切都在primefaces 页面中工作,但我有两个问题:

问题1:放置标记后,无法再放置标记。

问题2:在地图相同的形式中,还有一些其他元素,如文本字段。 我注意到当我单击地图所在表单中的提交按钮时,验证不会发生,实际上表单根本没有提交(这在我添加地图之前没有发生),为什么地图会中断验证? 在此输入图像描述

问题1:放置标记后,无法再放置标记。

此问题是由以下原因引起的:

  1. 你势必纬度和经度,以提供不同的bean( NewOfferSupportController )比持有地图模型(豆MapBean )。 您应该在PrimeFaces展示中使用MapBean示例作为NewOfferSupportController bean的设计起点。 它即存储标记集。 隐藏的输入必须指向该bean,因为在addMarker()方法中将添加这些值。 从陈列柜例子中,你只需要重新命名MapBean类的名称,并重新命名#{mapBean}通过在视图中引用#{newOfferSupportController}

  2. 您的NewOfferSupportController bean是请求范围的,它应该是视图范围。

     @ManagedBean @ViewScoped public class NewOfferSupportController implements Serializable {} 

    只要您通过Ajax与相同的表单进行交互,就可以查看作用域的bean。 但是请求scoped bean在每个请求上都会被重新创建(因此也会在每个Ajax请求上重新创建!),因此会丢弃之前放置在地图中的标记以及在添加标记之前输入的输入。


问题2:在地图相同的形式中,还有一些其他元素,如文本字段。 实际上表格根本没有提交(这在我添加地图之前没有发生),为什么地图会破坏验证?

这适合我。 这可能是因为您的NewOfferSupportController已放置在请求范围而不是视图范围中。

回顾一下,这是我在测试中使用的代码:

视图:

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

(我没有更改showcase示例中的<script>代码,只是将其保持不变)

豆:

@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.
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM