标题名称错误,对不起。不太确定如何对此进行总结。

我正在尝试使用OpenLayers map API将带有许多标记的地图打印到页面上。我有可用的代码,但是当我尝试将其移至单独的Coffeescript类时,它会静默失败。以下代码有效:

fromProjection = new OpenLayers.Projection("EPSG:4326") # Transform from WGS 1984
toProjection = new OpenLayers.Projection("EPSG:900913") # to Spherical Mercator Projection
mapnik = new OpenLayers.Layer.OSM()
markers = new OpenLayers.Layer.Markers("Markers")

map = new OpenLayers.Map("john-muir-trail-map")
markerCoordinates = -> $("\#john-muir-trail-data").data('markers').split('+')

paint = ->
  map.addLayer(mapnik)
  map.addLayer(markers)

  for pair in markerCoordinates()
    coords = pair.split(":")
    pos = new OpenLayers.LonLat(coords[1], coords[0]).transform( fromProjection, toProjection )
    markers.addMarker(new OpenLayers.Marker(pos))
    map.setCenter(pos, 8)


paint()


它依赖于两个存在的div(一个ID为“ john-muir-trail-map”,另一个ID为“ john-muir-trail-data”和一些标记数据)。当上面的代码在我的主.coffee文件中时,它工作得很好。

但是,当我尝试通过将地图代码移到单独的OpenLayerMap Coffeescript类中来对事物进行模块化时,不会出现任何错误,但这是行不通的。这就是我所做的。 (我很确定我正确地包含了这些东西。该类以及它的方法和属性都可以从我的主文件中获得):

class OpenLayersMap

  constructor: (mapId) ->
    @mapId = mapId

  fromProjection: new OpenLayers.Projection("EPSG:4326") # Transform from WGS 1984
  toProjection: new OpenLayers.Projection("EPSG:900913") # to Spherical Mercator Projection
  mapnik: new OpenLayers.Layer.OSM()
  markers: new OpenLayers.Layer.Markers("Markers")

  map: new OpenLayers.Map("#{@mapId}-map")
  markerCoordinates: -> $("\##{@mapId}-data").data('markers').split('+')

  paint: ->
    @map.addLayer(@mapnik)
    @map.addLayer(@markers)

    for pair in @markerCoordinates()
      coords = pair.split(":")
      pos = new OpenLayers.LonLat(coords[1], coords[0]).transform( @fromProjection, @toProjection )
      @markers.addMarker(new OpenLayers.Marker(pos))
      @map.setCenter(pos, 8)

window.OpenLayersMap = OpenLayersMap


然后,我在先前的文件中将其命名为:

map = new OpenLayersMap('john-muir-trail')
map.paint()


我认为OpenLayers围绕投影等的细节并不重要。重要的是要正确传入和使用mapId,如果我在paint()函数中投入了调试器,则调试器将被命中,此时所有可用的属性对我来说都是很好的。正确地包含了该类,等等。但是,没有地图被绘制。

我有Ruby背景,并且我对paint()函数的作用和副作用感到困惑。如果它本质上是相同的行为,为什么在不同的文件中表现不同?

有任何想法为什么会失败(无声)?它让我有点发疯。

最佳答案

我相信您在地图属性中使用@会导致此问题。而不是访问OpenLayersMap的当前实例,而是在mapId上调用静态属性OpenLayersMap。例如:

map: new OpenLayers.Map("#{@mapId}-map")


将编译为:

OpenLayersMap.prototype.map = new OpenLayers.Map("" + OpenLayersMap.mapId + "-map");




您将需要使map为访问在构造函数中设置的@mapId的方法。

map: -> new OpenLayers.Map("#{@mapId}-map")

09-27 03:45