javascript - 使用来自 mysql (laravel) 的数据显示带有标记的谷歌地图

标签 javascript php google-maps laravel google-maps-api-3

我正在开发一个包含谷歌地图和一堆标记的网络应用程序。 今天早上我有来自数据库的工作 map +标记(但我只使用了一个包含数据的表)。

今天早上:

map with markers

现在我正在尝试放置标记自定义图标和信息窗口以获得类似的东西(这是在没有 laravel 的情况下,只有 php 制作的)。

plane php ss

这是我的代码:

@extends('layouts.app')

@section('content')
    <script src="http://maps.google.com/maps/api/js?sensor=false"
            type="text/javascript"></script>
    <script type="text/javascript">
        //<![CDATA[

        function load() {

            var map = new google.maps.Map(document.getElementById('map'), {
                center: {lat: 45.327168, lng: 14.442902},
                zoom: 13
            });

            var infoWindow = new google.maps.InfoWindow;

            @foreach($markers as $marker)
                var sadrzaj = {{$marker->nazivMarkera}};
                var adresa = {{$marker->adresa}};
                var grad = {{$marker->nazivGrada}};
                var postanskibroj = {{$marker->postanski_broj}};
                var zupanija = {{$marker->nazivZupanije}};

                var html = "<b>" + sadrzaj + "</b> <br/>" + adresa +",<br/>"+postanskibroj+" "+grad+",<br/>"+zupanija;

                var lat = {{$marker->lat}};
                var lng = {{$marker->lng}};
                var image = {{$marker->slika}};

                var markerLatlng = new google.maps.LatLng(parseFloat(lat),parseFloat(lng));


                var mark = new google.maps.Marker({
                    map: map,
                    position: markerLatlng,
                    icon: image
                });

                bindInfoWindow(mark, map, infoWindow, html);
            @endforeach
        }

        function bindInfoWindow(mark, map, infoWindow, html){
            google.maps.event.addListener(marker, 'click', function(){
                infoWindow.setContent(html);
                infowWindow.open(map, mark);
            });
        }

        function doNothing(){}
        //]]>
    </script>
<div class="container">
    <div class="row">
        <div class="col-md-10 col-md-offset-1">
            <div class="panel panel-default">
                <div class="panel-heading">Dobro došli!</div>

                <div class="panel-body">

                    <!-- Moj kod  -->

                    <div id="map"></div>




                    <!-- DO TU -->
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

当我检查页面时,我可以看到我的数据数组已填满,并且我拥有来自数据库的所有数据。

picture 3

有人可以帮助我并向我解释问题出在哪里吗?为什么当我删除标记的功能并仅设置 map 初始化时,我可以毫无问题地获得 map View ,而现在我什至没有获得 map 。

现在:

picture 4

最佳答案

看起来 load() 没有在任何地方被调用。

我还注意到在您的屏幕截图中,laravel 回显的变量周围没有引号。

我会将 laravel(blade) 排除在 javascript 之外。目前,您的 foreach 循环将转储大量 javascript 代码,这些代码将覆盖并重新声明变量。这通常很困惑,被认为是不好的做法。

我还会将 map 设置为全局变量,以防您稍后要对其进行操作。

试试这个:

    var map;
    var markers = {!! json_encode($markers) !!}; //this should dump a javascript array object which does not need any extra interperting.
    var marks = []; //just incase you want to be able to manipulate this later

    function load() {

        map = new google.maps.Map(document.getElementById('map'), {
            center: {lat: 45.327168, lng: 14.442902},
            zoom: 13
        });           

        for(var i = 0; i < markers.length; i++){
            marks[i] = addMarker(markers[i]);
        }
    }

    function addMarker(marker){
        var sadrzaj = marker.nazivMarkera};
        var adresa = marker.adresa;
        var grad = marker.nazivGrada;
        var postanskibroj = marker.postanski_broj;
        var zupanija = marker.nazivZupanije;

        var html = "<b>" + sadrzaj + "</b> <br/>" + adresa +",<br/>"+postanskibroj+" "+grad+",<br/>"+zupanija;


        var markerLatlng = new google.maps.LatLng(parseFloat(marker.lat),parseFloat(marker.lng));


        var mark = new google.maps.Marker({
            map: map,
            position: markerLatlng,
            icon: marker.slika
        });

        var infoWindow = new google.maps.InfoWindow;
        google.maps.event.addListener(mark, 'click', function(){
            infoWindow.setContent(html);
            infoWindow.open(map, mark);
        });

        return mark;
    }

    function doNothing(){} //very appropriately named function. whats it for?

我还修正了代码中的几个小错误,比如

  1. 信息窗口在您的绑定(bind)函数“infowWindow”中拼写错误
  2. 您的 infoWindow 监听器需要绑定(bind)到 mark not marker
  3. 你真的不需要从标记中单独提取每个变量

此外,您需要从某处调用 load() 函数。也许将 onLoad="load()"放在你的 body 对象或顶级 div 上。或者使用谷歌 DOM 监听器:

google.maps.event.addDomListener(window, 'load', load);

这将在窗口准备好时执行您的 load() 函数。

关于javascript - 使用来自 mysql (laravel) 的数据显示带有标记的谷歌地图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35471128/

相关文章:

javascript - 当有人访问我的网站时如何更改光标指针并在其上应用 css

php - 分组多维数组

php - 使用过滤器时出现分页问题

javascript - 禁用 Google API DirectionsService 中两个可拖动标记之一

javascript - 使用 jQuery 检查 ID 是否存在

javascript - Canvas drawImage 不在 Cordova 中绘制,安全问题?

javascript - 将多边形导入 Google 我的 map

android - 如何控制 GroundOverlay 与 map 要素的 z-index

PHP PDO 总是只给出一个结果

php - 检测到服务 "session"的循环引用,路径 : "session -> session.flash_bag -> session"