标题名称错误,对不起。不太确定如何对此进行总结。
我正在尝试使用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")