使用 JSON 数据使用数据库对象填充 Google 地图

Posted

技术标签:

【中文标题】使用 JSON 数据使用数据库对象填充 Google 地图【英文标题】:Using JSON Data to Populate a Google Map with Database Objects 【发布时间】:2010-12-01 20:42:59 【问题描述】:

在阅读原始答案中提到的资源并努力实施后,我正在修改这个问题。

我正在使用 google maps api 将地图集成到我的 Rails 站点中。我有一个包含以下列的市场模型:ID、名称、地址、lat、lng。

在我的市场/指数视图中,我想用我的市场表中的所有市场填充一张地图。我正在尝试将@markets 输出为 json 数据,这就是我遇到问题的地方。我有显示的基本地图,但现在它只是一张空白地图。我非常密切地关注教程,但我无法让标记从 json 动态生成。非常感谢任何帮助!

这是我的设置:

市场总监:

def index
   @markets = Market.filter_city(params[:filter])
     respond_to do |format|
     format.html # index.html.erb
     format.json  render :json => @market
     format.xml   render :xml => @market 
  end
end

市场/指数视图:

<head>
    <script type="text/javascript"
      src="http://www.google.com/jsapi?key=GOOGLE KEY REDACTED, BUT IT'S THERE" >
</script>
<script type="text/javascript">
    var markets = <%= @markets.to_json %>;
</script>
<script type="text/javascript" charset="utf-8">
    google.load("maps", "2.x");
    google.load("jquery", "1.3.2");
  </script>
</head>
<body>    
    <div id="map" style="width:400px; height:300px;"></div> 
</body>    

公共/javascripts/application.js:

function initialize()    
  if (GBrowserIsCompatible() && typeof markets != 'undefined') 
    var map = new GMap2(document.getElementById("map"));
    map.setCenter(new GLatLng(40.7371, -73.9903), 13);
    map.addControl(new GLargeMapControl());

function createMarker(latlng, market) 
  var marker = new GMarker(latlng);
  var html="<strong>"+market.name+"</strong><br />"+market.address;
  GEvent.addListener(marker,"click", function() 
    map.openInfoWindowHtml(latlng, html);
  );
  return marker;


var bounds = new GLatLngBounds;
for (var i = 0; i < markets.length; i++) 
  var latlng=new GLatLng(markets[i].lat,markets[i].lng)
  bounds.extend(latlng);
  map.addOverlay(createMarker(latlng, markets[i]));

window.onload=initialize;  
window.onunload=GUnload;    

【问题讨论】:

不应该是@markets 而不是format.json render :json =&gt; @market 中的@market 吗? 您不需要在 Markets/index 视图中添加 &lt;script type="text/javascript" src="/javascripts/application.js"&gt;&lt;/script&gt; 吗? 【参考方案1】:

我在创建原型时采用的方法是不让视图的 html 版本负责创建地图和放置标记。我所做的是使用Google Maps API、jQuery、ajax 和 json。我的页面最初加载,然后请求 json(这将是您的市场列表)。获得 json 后,我将创建地图并使用 jQuery 和 Google Maps API 添加标记。

Here's a good tutorial 用于 jQuery 和 Google 地图入门。

编辑:这是我如何简化它以开始使用 - 一旦它工作,然后重新添加 html 和事件内容。

function createMarker(latlng, market) 
  return new GMarker(latlng);


$(function() 
  if (GBrowserIsCompatible() && typeof markets != 'undefined') 
    var map = new GMap2(document.getElementById("map"));
    map.setCenter(new GLatLng(40.7371, -73.9903), 13);
    map.addControl(new GLargeMapControl());

    $(markers).each(function(i, obj) 
      var m = obj.market; // this *might* be var m = obj;
      var latlng = new GLatLng(m.lat, m.lng); // check m.lat and m.lng in FireBug
      map.addOverlay(createMarker(latlng, m));
    );
  
);

【讨论】:

嘿,安迪,根据我在修改后的问题中粘贴的代码,你能给我关于该过程的 json 部分的任何指示吗? 哪个部分不工作?我唯一要改变的是切换到 jQuery 的 ready 函数。删除 window.onload... 并将您的应用程序 JS 放入 $(document).ready(function() ); 更准确地说,地图上填充了一个点,但它停留在屏幕上的固定位置,与我数据库中的任何市场都没有关联。换句话说,无论我如何移动地图或放大/缩小,标记都不会移动。 我会尝试将其逐个分解。这有点涉及所以我要编辑我的答案。 安迪,感谢您花时间发布此代码。在尝试实现它时,我不断收到 js 错误——我对 js 的经验为零,所以我确信这是我的问题。最后我有一个更有经验的朋友帮我解决了这个问题,我们不得不做一些时髦的事情来让它工作。仍然不确定核心问题是什么。【参考方案2】:

不确定您是否只是在寻找免费资源,但 Advanced Rails Recipes 这本书对此有很好的描述。您可以从 Pragmatic Programmer 的网站获取源代码(我也建议您购买这本书)。

【讨论】:

以上是关于使用 JSON 数据使用数据库对象填充 Google 地图的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JSON 数据递归填充 TreeView

如何使用大型 json 数据填充 RecyclerView [重复]

在 Swift 中使用 JSON 对象填充表视图

预填充核心数据存储:使用 JSON 属性列表还是 XML 文件?

使用Spring-Data-JPA进行Spring启动:每次请求时都会填充ArrayList / JSON对象

如何从 jquery 中的 json 格式对象填充 html 数据表