【问题标题】:How to place Google Maps Marker after each request如何在每次请求后放置 Google Maps Marker
【发布时间】:2016-07-08 13:22:25
【问题描述】:

我有一个简单的 Web 应用程序,上面有 JSP 页面和表单。它将带有“ID”标签的请求发送到 servlet。 Servlet 将此 ID 查询到 MySQL DB 并返回一个地址,该地址用于在地图上创建标记。

我想要我的申请:

  1. 在地图上的每个请求后显示所有标记
  2. 有机会删除他们或所有人

但现在我所拥有的只是更新页面并且只有一个标记。

我将不胜感激!

这是一个jsp页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-16"/>
    <title>Google Maps Geocoding Demo</title>
    <script src="http://maps.google.com/maps/api/js?sensor=false"
            type="text/javascript"></script>
</head>
<body>
<form action="qwe" method="get">
    <table>
        <tr>
            <td align="left"> ID</td>
            <td><input type="text" name="id"></td>
        </tr>
        <tr>
            <td><input type="submit" value="Send"></td>
        </tr>
        <tr>
            <td>Adress:</td>
            <td>${Street_char} ${Street_name},${Street_adr}, ${Flat_number} floor ${Floor}</td>
        </tr>
        <tr>
            <td>test</td>
            <td>${test}</td>
        </tr>
    </table>
</form>
<br>
<div id="map" style="width: 400px; height: 400px;"></div>

<script type="text/javascript">

    var address = "${address}";
    var map = new google.maps.Map(document.getElementById('map'), {
        mapTypeId: google.maps.MapTypeId.ROADMAP,
        zoom: 18
    });

    var geocoder = new google.maps.Geocoder();
    geocoder.geocode({'address': address},
            function (results, status) {
                if (status == google.maps.GeocoderStatus.OK) {

                    var marker = new google.maps.Marker({
                        position: results[0].geometry.location,
                        map: map,
                        title: 'Uluru-Test'
                    });
                    var infowindow = new google.maps.InfoWindow();

                    new google.maps.event.addListener(marker, 'mouseover', (function (marker) {
//                    new google.maps.event.addListener(marker, 'click', (function(marker) {
                        return function () {
                            var content = address;
                            infowindow.setContent('<div><strong>' + 'test' + '</strong><br>' + content + '</div>');
                            infowindow.open(map, marker);
                        }
                    })(marker));

                    map.setCenter(results[0].geometry.location);
                }
                else {
                    // Google couldn't geocode this request. Handle appropriately.
                }
            });
</script>
</body>
</html>

这里是servlet:

@WebServlet(name = "Servlet", value = "/qwe")
public class Servlet extends HttpServlet {

    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    private static final String URL = "jdbc:mysql://localhost:3306/web";
    private static final String USERNAME = "root";
    private static final String PASSWORD = "root";
    Connection connection;
    PreparedStatement preparedStatement;
    Variables variables = new Variables();
    Variables adr = new Variables(variables.getStreet_char(), variables.getStreet_name(), variables.getStreet_adr());

    String Select_addr = "SELECT * FROM client WHERE id=?;";

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        int id_jsp = Integer.parseInt(req.getParameter("id"));
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
            preparedStatement = connection.prepareStatement(Select_addr);
            preparedStatement.setInt(1, id_jsp);
            ResultSet resultSet = preparedStatement.executeQuery();

            while (resultSet.next()) {
                variables.setId(resultSet.getInt("id"));
                variables.setName(resultSet.getString("Name"));
                variables.setSurname(resultSet.getString("Surname"));


    variables.setStreet_char(resultSet.getString("Street_char"));
   variables.setStreet_name(resultSet.getString("Street_name"));
                variables.setStreet_adr(resultSet.getString("Street_adr"));
                variables.setFlat_number(resultSet.getInt("Flat_number"));
                variables.setFloor(resultSet.getInt("Floor"));
            }

            resp.setContentType("text/html;charset=utf-8");
            PrintWriter out = resp.getWriter();
            out.println("ID: " + id_jsp + "<br>");

            String adr = "" + variables.getStreet_char() + " " + variables.getStreet_name()
                    + "," + variables.getStreet_adr() + "";
            req.setAttribute("test", adr);
            req.setAttribute("Name", variables.getName());
            req.setAttribute("Surname", variables.getSurname());
            req.setAttribute("Street_char", variables.getStreet_char());
            req.setAttribute("Street_name", variables.getStreet_name());
            req.setAttribute("Street_adr", variables.getStreet_adr());
            req.setAttribute("Flat_number", variables.getFlat_number());
            req.setAttribute("Floor", variables.getFloor());
            req.setAttribute("address", adr);
            req.getRequestDispatcher("mypage.jsp").forward(req, resp);

            System.out.println(adr);
//            out.close();
            resultSet.close();
            preparedStatement.close();
            connection.close();
        } catch (SQLException se) {
            se.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (preparedStatement != null)
                    preparedStatement.close();
            } catch (SQLException se2) {
                se2.printStackTrace();
            }
            try {
                if (connection != null)
                    connection.close();
            } catch (SQLException se) {
                se.printStackTrace();
            }
        }
    }
}

【问题讨论】:

  • 有两种方法可以实现这一点。 1. 使用 Session,在 Servlet 中你需要将所有地址添加到一个列表中,并将列表放入 session 中。在 JSP 中,从会话中遍历地址列表并添加多个标记。 2. Ajax 方式,点击按钮时发送 Ajax 请求,获取 JSON 格式的地址,并使用 JSON 添加标记。
  • JChap,如何体现第二种方式。你能举一些例子吗,因为我不知道没有 Ajax 没有 JSON。我想在每个按钮单击并发送地址后添加标记。

标签: java google-maps jsp servlets google-maps-api-3


【解决方案1】:

希望您在每个请求中只设置一个地址。相反,您可以尝试获取所有地址并将其作为 json 数组发送到 jsp。

在以下示例中,我使用City, Country 进行标记。我的 json 数组将如下所示,

[{city: "Manhattan",country:"United States",state:"Manhattan"},
{city:"Newark",country:"United States",state:"Newark"}]

我的脚本来启动和生成标记,

<script type="text/javascript">

    var map;
    // Creates the map
    function initialize() {
      map = new google.maps.Map(document.getElementById('map'), {
        zoom: 10,
        center: new google.maps.LatLng(40.77627, -73.910965), //For Newyork
        mapTypeId: google.maps.MapTypeId.ROADMAP
      });
    }

    // This function takes an array argument containing a list of marker data
    function generateMarkers(locations) {
    //alert(locations);
      for (var i = 0; i < locations.length; i++) {

        new google.maps.Marker({
          position: new google.maps.LatLng(locations[i][1], locations[i][2]),
          map: map,
          title: locations[i][0]
        });
      }
    }

</script>

这里我使用 ajax 来加载地图。如果你的 json 包含可能像上面这样的数据,你可以使用这个函数来生成多个标记。

<div id="map" style="width:500px; height:250px;;padding-top:0px;margin:25px 50px 25px 55px;"></div>

    <script type="text/javascript">

        window.onload = function () {
            initialize();
            var d = $.ajax({
                type: "POST",
                url: "servletURL",
                cache: false,
                async: false
            }).responseText;
            var loc2 = [];
            var locations1 = "";
            if(d.length != 0) {
                var obj = jQuery.parseJSON(d);
                $.each(obj, function(key,row) {
                    //alert(row.city + "," + row.country);
                    var address = row.city + "," +row.country;
                    geocoder = new google.maps.Geocoder();
                    geocoder.geocode( { 'address': address}, function(results, status) {
                      if (status == google.maps.GeocoderStatus.OK) {
                        loc2.push("['" + row.city + "'," + results[0].geometry.location.lat() + "," + results[0].geometry.location.lng() +"]");
                        locations1 = "[" + loc2 + "]";
                        generateMarkers(eval(locations1));
                      } 
                      else {
                        alert("Geocode was not successful for the following reason: " + status);
                      }
                    });
                }); 
            }
        };
      </script>
</div>

使用多个标记查看生成的输出,

对于删除标记​​em>,我建议您更新 json 并再次加载它。希望这会有所帮助。

更新:

这就是我的业务逻辑获取数据的方式。我正在使用Spring &amp; Hibernate。我正在使用jackson jar 文件。它将java对象转换为json。你也可以使用Gson

public List<GoogleMapHelper> getAddressForGoogleMap() {
    String sql = "Select city, state, country FROM dbo.Customerdetails ";
    SQLQuery query = getSession().createSQLQuery(sql);
    query.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
    List data = query.list();
    List<GoogleMapHelper> address = new ArrayList<GoogleMapHelper>();
    for (Object object : data) {
        GoogleMapHelper googleHelper = new GoogleMapHelper();
        Map row = (Map) object;
        googleHelper.setCity(row.get("city").toString());
        googleHelper.setState(row.get("state").toString());
        googleHelper.setCountry(row.get("country").toString());
        address.add(googleHelper);
    }
    return address;
}

而我的GoogleMapHelper 只不过是 POJO 类,

public class GoogleMapHelper {

    private String city;

    private String state;

    private String country;

    (getters and setters)

}

【讨论】:

  • 感谢 Vinoth Krishnan 的回答!我可以在每次单击(增加)这个 json 数组后输入值吗?如果是怎么办? [{city: "Manhattan",country:"United States",state:"Manhattan"}, {city:"Newark",country:"United States",state:"Newark"}]关于删除标记_我需要删除的不是全部,而是由地址选择(将地址放入表单后,发送到servlet)
  • 您的地址来自哪里?如果它来自 db,请为每个地址保留一个标志。如果选择了一个地址进行显示,则将其标记为真。在删除的情况下,将其标记为假。否则,您必须将其存储在会话中。
  • 起初 db 表是干净的,但 html 表单的用户将此类信息放入 db:街道名称: 麦迪逊街 街道地址: 75 城市: 纽约和地图上的servlet返回标记。比用户添加下一个信息,servlet 必须在地图上再返回一个标记。等等。如果用户决定删除某个标记,他将请求对 db 进行查询,servlet 必须删除该标记,但其他标记必须保留在地图上
  • 当然,您的要求很简单。因此,您表中的所有地址都应可用作谷歌地图中的标记。编写一个单独的函数来获取地址和城市。转换为Json Array 将其返回给ajax。这将填充标记。如果您要删除一个地址,它在您的表格中也将不可用(我希望如此)。所以它不会在您的地图中可用。
  • 我的java部分也加了,希望对你有用。
猜你喜欢
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 2013-10-18
  • 1970-01-01
  • 2018-03-28
  • 1970-01-01
  • 2017-01-31
  • 1970-01-01
相关资源
最近更新 更多