Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

out of need, gh-pages #31

Open
wants to merge 29 commits into
base: gh-pages
Choose a base branch
from
Open
Changes from 2 commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
f97c4b2
Fixed repos link in header
jawj May 6, 2012
33aa37e
Fixed a stray google.maps reference
jawj May 7, 2012
c1df66a
Remove incorrect GMaps references
mourner Jul 23, 2012
ef97a81
Merge pull request #2 from mourner/patch-1
jawj Jul 23, 2012
9f42beb
Fix textile syntax for merged change.
jawj Jul 23, 2012
8cce6a6
Now checking that marker is added to map when iterating over candidat…
jawj Oct 14, 2013
cc37374
Fix demo map source URL
ryanjhodge Feb 27, 2016
7422a80
Merge pull request #26 from ryanjhodge/master
jawj May 10, 2016
8758372
make compatible with other types of markers that don't have available…
robertleeplummerjr Jun 3, 2016
d970eea
cleanup build process
robertleeplummerjr Jun 3, 2016
255fd03
add index.html for demoing
robertleeplummerjr Jun 4, 2016
ddd4bf8
add image and rename map_canvas to map for clarity
robertleeplummerjr Jun 4, 2016
51faf40
add coffeescript as a dependency
robertleeplummerjr Jun 4, 2016
4966809
add leaflet from bower so demo works in browser
robertleeplummerjr Jun 4, 2016
c7eb9cc
minor cleanup
robertleeplummerjr Jun 4, 2016
92dd7dc
Merge branch 'master' into gh-pages
robertleeplummerjr Jun 4, 2016
fbe635f
Add canvas blurb
robertleeplummerjr Jun 4, 2016
bd79036
Merge branch 'master' into gh-pages
robertleeplummerjr Jun 4, 2016
7412169
simplify syntax
robertleeplummerjr Jun 8, 2016
e3fb636
Merge branch 'master' into gh-pages
robertleeplummerjr Jun 8, 2016
c7eac26
added logic checks and cleanup
robertleeplummerjr Jun 11, 2016
4c60a17
Merge branch 'master' into gh-pages
robertleeplummerjr Jun 11, 2016
e3bd7c3
ensure coffee-script is added as a dependency
robertleeplummerjr Jun 12, 2016
3fa4cd5
empty array check
robertleeplummerjr Jun 12, 2016
b552050
null check
robertleeplummerjr Jun 12, 2016
10f913b
convert circleStartAngle to degrees rather than radians for the human…
robertleeplummerjr Jun 25, 2016
7590dd1
mostly working simple spiderfy control with more normalized variables…
robertleeplummerjr Jun 26, 2016
0c09642
change name
robertleeplummerjr Jun 26, 2016
aca1486
Merge branch 'master' into gh-pages
robertleeplummerjr Jun 26, 2016
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 34 additions & 25 deletions lib/oms.coffee
Original file line number Diff line number Diff line change
@@ -10,7 +10,7 @@ Note: The Leaflet maps API must be included *before* this code

return unless this.L? # return from wrapper func without doing anything

class @.OverlappingMarkerSpiderfier
class @OverlappingMarkerSpiderfier
p = @:: # this saves a lot of repetition of .prototype that isn't optimized away
p.VERSION = '0.2.6'
twoPi = Math.PI * 2
@@ -33,50 +33,54 @@ class @.OverlappingMarkerSpiderfier
highlighted: '#f00'
unspiderfyEvents: ['click', 'zoomend']
spiderfyMarkerEvent: 'click'
body: {
body:
color: '#222'
radius: 3
opacity: 0.9
fillOpacity: 0.9
}

# Note: it's OK that this constructor comes after the properties, because of function hoisting
constructor: (@map, opts = {}) ->
extend(@, defaultOpts, opts)
@initMarkerArrays()
@listeners = {}
@map.addEventListener(e, => @.unspiderfy()) for e in @.unspiderfyEvents
if @unspiderfyEvents && @unspiderfyEvents.length
@map.addEventListener(e, => @unspiderfy()) for e in @unspiderfyEvents

p.initMarkerArrays = ->
@markers = []
@markerListeners = []
@bodies = []

p.addMarker = (marker) ->
return @ if marker._oms?
marker._oms = yes
markerListener = => @spiderListener(marker)
marker.addEventListener(@.spiderfyMarkerEvent, markerListener)
if @spiderfyMarkerEvent && @spiderfyMarkerEvent.length
marker.addEventListener(@spiderfyMarkerEvent, markerListener)
@markerListeners.push(markerListener)
@markers.push(marker)
@ # return self, for chaining

p.getMarkers = -> @markers[0..] # returns a copy, so no funny business

p.removeMarker = (marker) ->
@.unspiderfy() if marker._omsData? # otherwise it'll be stuck there forever!
@unspiderfy() if marker._omsData? # otherwise it'll be stuck there forever!
i = @arrIndexOf(@markers, marker)
return @ if i < 0
markerListener = @markerListeners.splice(i, 1)[0]
marker.removeEventListener(@.spiderfyMarkerEvent, markerListener)
if @spiderfyMarkerEvent && @spiderfyMarkerEvent.length
marker.removeEventListener(@spiderfyMarkerEvent, markerListener)
delete marker._oms
@markers.splice(i, 1)
@ # return self, for chaining

p.clearMarkers = ->
@.unspiderfy()
@unspiderfy()
for marker, i in @markers
markerListener = @markerListeners[i]
marker.removeEventListener(@.spiderfyMarkerEvent, markerListener)
if @spiderfyMarkerEvent && @spiderfyMarkerEvent.length
marker.removeEventListener(@spiderfyMarkerEvent, markerListener)
delete marker._oms
@initMarkerArrays()
@ # return self, for chaining
@@ -99,35 +103,35 @@ class @.OverlappingMarkerSpiderfier
func(args...) for func in (@listeners[event] ? [])

p.generatePtsCircle = (count, centerPt) ->
circumference = @.circleFootSeparation * (2 + count)
circumference = @circleFootSeparation * (2 + count)
legLength = circumference / twoPi # = radius from circumference
angleStep = twoPi / count
for i in [0...count]
angle = @.circleStartAngle + i * angleStep
angle = @circleStartAngle + i * angleStep
new L.Point(centerPt.x + legLength * Math.cos(angle),
centerPt.y + legLength * Math.sin(angle))

p.generatePtsSpiral = (count, centerPt) ->
legLength = @.spiralLengthStart
legLength = @spiralLengthStart
angle = 0
for i in [0...count]
angle += @.spiralFootSeparation / legLength + i * 0.0005
angle += @spiralFootSeparation / legLength + i * 0.0005
pt = new L.Point(centerPt.x + legLength * Math.cos(angle),
centerPt.y + legLength * Math.sin(angle))
legLength += twoPi * @.spiralLengthFactor / angle
legLength += twoPi * @spiralLengthFactor / angle
pt

p.spiderListener = (marker) ->
markerSpiderfied = marker._omsData?
if !@.keepSpiderfied
@.unspiderfy() unless markerSpiderfied
if !@keepSpiderfied
@unspiderfy() unless markerSpiderfied
if markerSpiderfied
@trigger('click', marker)
return @
else
nearbyMarkerData = []
nonNearbyMarkers = []
pxSq = @.nearbyDistance * @.nearbyDistance
pxSq = @nearbyDistance * @nearbyDistance
markerPt = @map.latLngToLayerPoint(marker.getLatLng())
for m in @markers
continue unless @map.hasLayer(m)
@@ -142,14 +146,14 @@ class @.OverlappingMarkerSpiderfier
@spiderfy(nearbyMarkerData, nonNearbyMarkers)

p.makeHighlightListeners = (marker) ->
highlight: => marker._omsData.leg.setStyle(color: @.legColors.highlighted)
unhighlight: => marker._omsData.leg.setStyle(color: @.legColors.usual)
highlight: => marker._omsData.leg.setStyle(color: @legColors.highlighted)
unhighlight: => marker._omsData.leg.setStyle(color: @legColors.usual)

p.spiderfy = (markerData, nonNearbyMarkers) ->
@spiderfying = yes
numFeet = markerData.length
bodyPt = @ptAverage(md.markerPt for md in markerData)
footPts = if numFeet >= @.circleSpiralSwitchover
footPts = if numFeet >= @circleSpiralSwitchover
@generatePtsSpiral(numFeet, bodyPt).reverse() # match from outside in => less criss-crossing
else
@generatePtsCircle(numFeet, bodyPt)
@@ -161,13 +165,13 @@ class @.OverlappingMarkerSpiderfier
markerCoords = marker.getLatLng()
lastMarkerCoords = markerCoords
leg = new L.Polyline [markerCoords, footLl], {
color: @.legColors.usual
weight: @.legWeight
color: @legColors.usual
weight: @legWeight
clickable: no
}
@map.addLayer(leg)
marker._omsData = {usualPosition: marker.getLatLng(), leg: leg}
unless @.legColors.highlighted is @.legColors.usual
unless @legColors.highlighted is @legColors.usual
mhl = @makeHighlightListeners(marker)
marker._omsData.highlightListeners = mhl
marker.addEventListener('mouseover', mhl.highlight)
@@ -178,9 +182,10 @@ class @.OverlappingMarkerSpiderfier
marker
delete @spiderfying
@spiderfied = yes
if @.body
body = L.circleMarker(lastMarkerCoords, @.body)
if @body
body = L.circleMarker(lastMarkerCoords, @body)
@map.addLayer(body)
@bodies.push(body)
@trigger('spiderfy', spiderfiedMarkers, nonNearbyMarkers)

p.unspiderfy = (markerNotToMove = null) ->
@@ -202,6 +207,10 @@ class @.OverlappingMarkerSpiderfier
unspiderfiedMarkers.push(marker)
else
nonNearbyMarkers.push(marker)

for body in @bodies
@map.removeLayer(body)

delete @unspiderfying
delete @spiderfied
@trigger('unspiderfy', unspiderfiedMarkers, nonNearbyMarkers)
41 changes: 28 additions & 13 deletions oms.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.