Difference between revisions of "Linden Lab Official:Map API Advanced Examples"
Rand Linden (talk | contribs) |
Rand Linden (talk | contribs) |
||
(16 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
{{ | {{Supported API}} | ||
{{:API Portal/navigation|map}} | |||
See [http://slurl.com/examples/ Second Life Map API Examples] to see these examples in action. | |||
'''NOTE:''' | |||
This API is still in beta. URLs and API signatures may change. See the [[Map API#Release notes|Release Notes]] for information on new features and known issues. | |||
== Linking to a Second Life coordinate | == Linking to a Second Life coordinate (NEW) == | ||
[[Image:Teleport window.png|right]] | [[Image:Teleport window.png|right]] | ||
The | The '''gotoSLURL()''' global function enables the user to teleport to the specified x,y coordinates, given a valid [[Webmap_API_Reference#SLMap|SLMap]] instance. It first opens a window displaying the region name and a "Teleport" button, for example as shown at right. | ||
<br> | <br> | ||
Line 15: | Line 18: | ||
For example, the following method call will pop-up the window illustrated here; the user can the click the "Teleport" button to open the Second Life Viewer and teleport to (997,1002). | For example, the following method call will pop-up the window illustrated here; the user can the click the "Teleport" button to open the Second Life Viewer and teleport to (997,1002). | ||
< | <javascript>gotoSLURL(997,1002, mapInstance);</javascript> | ||
gotoSLURL(997,1002, mapInstance); | |||
</ | |||
The example code below provides several similar examples. | The example code below provides several similar examples. | ||
Line 23: | Line 24: | ||
'''Source code''' | '''Source code''' | ||
< | <html4strict><!-- Insert HTML header here --> | ||
<!-- Insert HTML header here --> | |||
<script> | <script> | ||
var mapInstance; | var mapInstance; | ||
Line 41: | Line 41: | ||
<a href="javascript:gotoSLURL(1000, 1000, mapInstance)"> Go to (1000, 1000) </a><br /> | <a href="javascript:gotoSLURL(1000, 1000, mapInstance)"> Go to (1000, 1000) </a><br /> | ||
</body> | </body></html4strict> | ||
</ | |||
== Working with maps == | == Working with maps == | ||
Line 55: | Line 54: | ||
** The user double-clicks on the map. | ** The user double-clicks on the map. | ||
* Get the cooridnates of the map's center and bounds. | * Get the cooridnates of the map's center and bounds. | ||
See [http://slurl.com/examples/ Second Life Map API Examples] to see these examples in action. | |||
=== Customizing zoom and pan controls === | === Customizing zoom and pan controls === | ||
Line 60: | Line 61: | ||
It's easy to remove all the zoom and pan controls or create your own. When you create the SLMap object, simply specify false for the [[Webmap_API_Reference#SLMapOptions|SLMapOptions]] properties hasZoomControls and hasPanningControls, for example: | It's easy to remove all the zoom and pan controls or create your own. When you create the SLMap object, simply specify false for the [[Webmap_API_Reference#SLMapOptions|SLMapOptions]] properties hasZoomControls and hasPanningControls, for example: | ||
< | <javascript>mapInstance = new SLMap(document.getElementById('map-container'), | ||
mapInstance = new SLMap(document.getElementById('map-container'), | |||
{hasZoomControls: false, | {hasZoomControls: false, | ||
hasPanningControls: false}); | hasPanningControls: false});</javascript> | ||
</ | |||
This code creates a map with no zoom and pan controls. | This code creates a map with no zoom and pan controls. | ||
Line 84: | Line 83: | ||
'''Example source code''' | '''Example source code''' | ||
< | <html4strict><!-- Insert common HTML header --> | ||
<!-- Insert common HTML header --> | |||
<script> | <script> | ||
var mapInstance; | var mapInstance; | ||
Line 139: | Line 137: | ||
<br><br> | <br><br> | ||
<div id="map-container"></div> | <div id="map-container"></div> | ||
</body> | </body></html4strict> | ||
</ | |||
=== Disabling and enabling dragging === | === Disabling and enabling dragging === | ||
To disable dragging on the map, simply call '''disableDragging()''' on the map object. | To disable dragging on the map, simply call '''disableDragging()''' on the map object. | ||
< | <javascript>mapInstance.disableDragging();</javascript> | ||
mapInstance.disableDragging(); | |||
</ | |||
When you are done call '''enableDragging()''' on the map object to re-enable dragging. | When you are done call '''enableDragging()''' on the map object to re-enable dragging. | ||
Line 153: | Line 148: | ||
'''Example source code''' | '''Example source code''' | ||
< | <html4strict><!-- Insert common HTML header --> | ||
<!-- Insert common HTML header --> | |||
<script> | <script> | ||
var mapInstance; | var mapInstance; | ||
Line 170: | Line 164: | ||
<div id="map-container"></div> | <div id="map-container"></div> | ||
</body> | </body></html4strict> | ||
</ | |||
=== Panning or re-centering the map === | === Panning or re-centering the map === | ||
Line 181: | Line 174: | ||
For example: | For example: | ||
< | <javascript>mapInstance.panOrRecenterToSLCoord(new XYPoint(1000, 1000), true);</javascript> | ||
mapInstance.panOrRecenterToSLCoord(new XYPoint(1000, 1000), true); | |||
</ | |||
The above code pans or recenters the map to (1000, 1000) depending on the current view. | The above code pans or recenters the map to (1000, 1000) depending on the current view. | ||
Line 189: | Line 180: | ||
'''Example source code''' | '''Example source code''' | ||
< | <html4strict><!-- Insert common HTML header --> | ||
<!-- Insert common HTML header --> | |||
<script> | <script> | ||
var mapInstance; | var mapInstance; | ||
Line 218: | Line 208: | ||
<div id="map-container"></div> | <div id="map-container"></div> | ||
</body> | </body></html4strict> | ||
</ | |||
=== Setting | === Setting the onStateChangedHandler event handler === | ||
The map object has an onStateChangedHandler option that is a function called whenever the user pans or zooms the map. Specify it in the [[Webmap_API_Reference#SLMapOptions|options]] when you initially create the map object. For example: | The map object has an onStateChangedHandler option that is a function called whenever the user pans or zooms the map. Specify it in the [[Webmap_API_Reference#SLMapOptions|options]] when you initially create the map object. For example: | ||
< | <javascript>mapInstance = new SLMap(document.getElementById('map-container'), {onStateChangedHandler: doSomething});</javascript> | ||
mapInstance = new SLMap(document.getElementById('map-container'), {onStateChangedHandler: doSomething}); | |||
</ | |||
Whenever the user zooms or pans the map, the | Whenever the user zooms or pans the map, the Map API will call the doSomething function. | ||
This feature is handy when you want to show markers only currently in the user's viewport: in the event handler function, simply remove all the current markers, then place a new set of markers on the map based on the current map bounds. | This feature is handy when you want to show markers only currently in the user's viewport: in the event handler function, simply remove all the current markers, then place a new set of markers on the map based on the current map bounds. | ||
Line 235: | Line 222: | ||
'''Example source code''' | '''Example source code''' | ||
< | <html4strict><!-- Insert common HTML header --> | ||
<!-- Insert common HTML header --> | |||
<script> | <script> | ||
function loadmap() { | function loadmap() { | ||
Line 252: | Line 238: | ||
<p>This map will display an alert whenever the map's state changes (i.e. the map is panned or zoomed) | <p>This map will display an alert whenever the map's state changes (i.e. the map is panned or zoomed) | ||
<div id="map-container"></div> | <div id="map-container"></div> | ||
</body> | </body></html4strict> | ||
</ | |||
=== Setting click and double-click event handlers === | === Setting click and double-click event handlers === | ||
You can define a double click event handler function, that gets called when the user double-clicks on the map. For example: | You can define a double click event handler function, that gets called when the user double-clicks on the map. For example: | ||
< | <javascript>// creates a function that we will bind to the double click action | ||
// creates a function that we will bind to the double click action | |||
var doubleClickHandlerFunction = function(x,y) { | var doubleClickHandlerFunction = function(x,y) { | ||
alert("you double clicked at (" + x + "," + y + ")"); | alert("you double clicked at (" + x + "," + y + ")"); | ||
Line 272: | Line 256: | ||
{doubleClickHandler: doubleClickHandlerFunction | {doubleClickHandler: doubleClickHandlerFunction | ||
clickHandler: clickHandlerFunction}); | clickHandler: clickHandlerFunction}); | ||
mapInstance.centerAndZoomAtSLCoord(new XYPoint(997.5, 1001.5), 2); | mapInstance.centerAndZoomAtSLCoord(new XYPoint(997.5, 1001.5), 2);</javascript> | ||
</ | |||
{{Hilite|This does not appear to work currently.}} | {{Hilite|This does not appear to work currently.}} | ||
Line 282: | Line 265: | ||
'''Example source code''' | '''Example source code''' | ||
< | <html4strict><!-- Insert common HTML header --> | ||
<!-- Insert common HTML header --> | |||
<script> | <script> | ||
function doubleClickHandlerFunction() { | function doubleClickHandlerFunction() { | ||
Line 306: | Line 288: | ||
<p>There should be a yellow marker in the center of this map: | <p>There should be a yellow marker in the center of this map: | ||
<div id="map-container"></div> | <div id="map-container"></div> | ||
</body> | </body></html4strict> | ||
</ | |||
=== Getting current map center and bounds === | === Getting current map center and bounds === | ||
Line 323: | Line 304: | ||
'''Example source code''' | '''Example source code''' | ||
< | <html4strict><!-- Insert common HTML header --> | ||
<!-- Insert common HTML header --> | |||
<script> | <script> | ||
var mapInstance; | var mapInstance; | ||
Line 367: | Line 347: | ||
<p>Y-Max: <span id='yMax'></span></p> | <p>Y-Max: <span id='yMax'></span></p> | ||
<div id="map-container"></div> | <div id="map-container"></div> | ||
</body> | </body></html4strict> | ||
</ | |||
== Working with markers == | == Working with markers == | ||
The Marker object displays a small image at a particular x, y point on the map. | The Marker object displays a small image at a particular x, y point on the map. | ||
See [http://slurl.com/examples/ Second Life Map API Examples] to see these examples in action. | |||
=== Setting a marker's event handlers === | === Setting a marker's event handlers === | ||
Line 383: | Line 364: | ||
Set these event handlers to Javascript functions when you construct the Map object. For example: | Set these event handlers to Javascript functions when you construct the Map object. For example: | ||
< | <javascript>// creates a function that we will bind to the marker click action | ||
// creates a function that we will bind to the marker click action | |||
var doMarkerAction = function(marker) { | var doMarkerAction = function(marker) { | ||
alert("an event occured at (" + marker.slCoord.x + "," + marker.slCoord.y + ")"); | alert("an event occured at (" + marker.slCoord.x + "," + marker.slCoord.y + ")"); | ||
Line 394: | Line 374: | ||
{clickHandler: doMarkerAction, | {clickHandler: doMarkerAction, | ||
onMouseOutHandler: doMarkerAction, | onMouseOutHandler: doMarkerAction, | ||
onMouseOverHandler: doMarkerAction}); | onMouseOverHandler: doMarkerAction});</javascript> | ||
</ | |||
The code above simple sets all three event handlers of the marker to the '''doMarkerAction()''' function. The marker is passed as a parameter to this function. | The code above simple sets all three event handlers of the marker to the '''doMarkerAction()''' function. The marker is passed as a parameter to this function. | ||
Line 401: | Line 380: | ||
'''Example source code''' | '''Example source code''' | ||
< | <html4strict><html> | ||
<html> | |||
<head> | <head> | ||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> | <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> | ||
Line 434: | Line 412: | ||
{ | { | ||
// create the icons for use as a marker | // create the icons for use as a marker | ||
var yellow_dot_image = new Img(" | var yellow_dot_image = new Img("b_map_yellow.gif", 9, 9); | ||
var yellow_icon = new Icon(yellow_dot_image); | var yellow_icon = new Icon(yellow_dot_image); | ||
var all_images = [yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon]; | var all_images = [yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon]; | ||
Line 461: | Line 439: | ||
<p>Click handler installed: | <p>Click handler installed: | ||
<div id="map-container2"></div> | <div id="map-container2"></div> | ||
</body> | </body></html4strict> | ||
</ | |||
<!-- | <!-- | ||
Line 501: | Line 478: | ||
{ | { | ||
// create the icons for use as a marker | // create the icons for use as a marker | ||
var yellow_dot_image = new Img(" | var yellow_dot_image = new Img("b_map_yellow.gif", 9, 9); | ||
var yellow_icon = new Icon(yellow_dot_image); | var yellow_icon = new Icon(yellow_dot_image); | ||
var all_images = [yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon]; | var all_images = [yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon]; | ||
Line 565: | Line 542: | ||
{ | { | ||
// create the icons for use as a marker | // create the icons for use as a marker | ||
var yellow_dot_image = new Img(" | var yellow_dot_image = new Img("b_map_yellow.gif", 9, 9); | ||
var yellow_icon = new Icon(yellow_dot_image); | var yellow_icon = new Icon(yellow_dot_image); | ||
var all_images = [yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon]; | var all_images = [yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon]; | ||
Line 600: | Line 577: | ||
Call the map object's '''removeMarker()''' method to remove a marker, passing the marker object as the parameter. For example: | Call the map object's '''removeMarker()''' method to remove a marker, passing the marker object as the parameter. For example: | ||
< | <javascript>mapInstance.removeMarker(myMarker);</javascript> | ||
mapInstance.removeMarker(myMarker); | |||
</ | |||
The above code removes the marker myMarker. | The above code removes the marker myMarker. | ||
Line 609: | Line 584: | ||
'''Example source code''' | '''Example source code''' | ||
< | <html4strict><script> | ||
<script> | |||
<!-- Insert common HTML header --> | <!-- Insert common HTML header --> | ||
// mapInstance and marker are global, so removeMarker() can access them. | // mapInstance and marker are global, so removeMarker() can access them. | ||
Line 621: | Line 595: | ||
// Creates the icons | // Creates the icons | ||
var yellow_dot_image = new Img(" | var yellow_dot_image = new Img("b_map_yellow.gif", 9, 9); | ||
var yellow_icon = new Icon(yellow_dot_image); | var yellow_icon = new Icon(yellow_dot_image); | ||
var all_images = [yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon]; | var all_images = [yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon]; | ||
Line 639: | Line 613: | ||
<a href="javascript: removeMarker();">Click to remove the yellow marker from the map</a> | <a href="javascript: removeMarker();">Click to remove the yellow marker from the map</a> | ||
<div id="map-container"></div> | <div id="map-container"></div> | ||
</body> | </body></html4strict> | ||
</ | |||
=== Triggering a marker click === | === Triggering a marker click === | ||
Line 657: | Line 630: | ||
For example: | For example: | ||
< | <javascript>// creates the icons | ||
// creates the icons | |||
var forsale_sign = new Img("forsale.png", 80, 83, true); // note how the fourth parameter is set true! | var forsale_sign = new Img("forsale.png", 80, 83, true); // note how the fourth parameter is set true! | ||
var forsale_shadow = new Img("forsale-shadow.png", 98, 83, true); | var forsale_shadow = new Img("forsale-shadow.png", 98, 83, true); | ||
Line 666: | Line 638: | ||
// creates the marker | // creates the marker | ||
var marker = new Marker(all_images, new XYPoint(995, 1004)); | var marker = new Marker(all_images, new XYPoint(995, 1004)); | ||
mapInstance.addMarker(marker); | mapInstance.addMarker(marker);</javascript> | ||
</ | |||
== Additional examples == | == Additional examples == | ||
See [http://slurl.com/examples/ Second Life Map API Examples] to see these examples in action. | |||
<!-- Doesn't work | |||
=== Closing a map window automatically when user pans the map === | === Closing a map window automatically when user pans the map === | ||
<pre> | <pre> | ||
Line 704: | Line 678: | ||
</body> | </body> | ||
</pre> | </pre> | ||
--> | |||
=== Aligning marker images === | === Aligning marker images === | ||
< | <html4strict><html> | ||
<html> | |||
<head> | <head> | ||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> | <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> | ||
Line 734: | Line 708: | ||
{ | { | ||
// create the icons for use as a marker | // create the icons for use as a marker | ||
var yellow_dot_image = new Img(" | var yellow_dot_image = new Img("b_map_yellow.gif", 9, 9); | ||
var yellow_icon = new Icon(yellow_dot_image); | var yellow_icon = new Icon(yellow_dot_image); | ||
var all_images = [yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon]; | var all_images = [yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon]; | ||
Line 763: | Line 737: | ||
<p>Marker icon aligned to bottom-right: | <p>Marker icon aligned to bottom-right: | ||
<div id="map-container2"></div> | <div id="map-container2"></div> | ||
</body> | </body></html4strict> | ||
</ | |||
=== Centering the map on a marker when user clicks it === | === Centering the map on a marker when user clicks it === | ||
< | <html4strict><html> | ||
<html> | |||
<head> | <head> | ||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> | <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> | ||
Line 795: | Line 767: | ||
{ | { | ||
// create the icons for use as a marker | // create the icons for use as a marker | ||
var yellow_dot_image = new Img(" | var yellow_dot_image = new Img("b_map_yellow.gif", 9, 9); | ||
var yellow_icon = new Icon(yellow_dot_image); | var yellow_icon = new Icon(yellow_dot_image); | ||
var all_images = [yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon]; | var all_images = [yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon]; | ||
Line 822: | Line 794: | ||
<p>Clicking on this marker should center the map on the marker: | <p>Clicking on this marker should center the map on the marker: | ||
<div id="map-container2"></div> | <div id="map-container2"></div> | ||
</body> | </body></html4strict> | ||
</ | |||
=== Controlling marker z-order === | === Controlling marker z-order === | ||
< | <html4strict><html> | ||
<html> | |||
<head> | <head> | ||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> | <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> | ||
Line 897: | Line 866: | ||
<p>The '2' marker icon should be on top of the '1' marker icon: | <p>The '2' marker icon should be on top of the '1' marker icon: | ||
<div id="map-container2"></div> | <div id="map-container2"></div> | ||
</body> | </body></html4strict> | ||
</ | |||
=== Removing all markers from a map === | === Removing all markers from a map === | ||
< | <html4strict><html> | ||
<html> | |||
<head> | <head> | ||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> | <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> | ||
Line 925: | Line 892: | ||
// creates the icons | // creates the icons | ||
var yellow_dot_image = new Img(" | var yellow_dot_image = new Img("b_map_yellow.gif", 9, 9); | ||
var yellow_icon = new Icon(yellow_dot_image); | var yellow_icon = new Icon(yellow_dot_image); | ||
var all_images = [yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon]; | var all_images = [yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon]; | ||
Line 952: | Line 919: | ||
<a href="javascript: mapInstance.removeAllMarkers();">Click to remove all the markers</a> | <a href="javascript: mapInstance.removeAllMarkers();">Click to remove all the markers</a> | ||
<div id="map-container"></div> | <div id="map-container"></div> | ||
</body> | </body></html4strict> | ||
</ | |||
'''Example source code''' | '''Example source code''' | ||
< | <html4strict><!-- Insert common HTML header --> | ||
<!-- Insert common HTML header --> | |||
<script> | <script> | ||
function loadmap() { | function loadmap() { | ||
Line 980: | Line 945: | ||
<p>The map shows a 'for sale' sign marker with smooth edges, and an anti-aliased shadow. | <p>The map shows a 'for sale' sign marker with smooth edges, and an anti-aliased shadow. | ||
<div id="map-container"></div> | <div id="map-container"></div> | ||
</body> | </body></html4strict> | ||
</ | |||
<!-- | <!-- |
Latest revision as of 13:28, 4 May 2011
See Second Life Map API Examples to see these examples in action.
NOTE: This API is still in beta. URLs and API signatures may change. See the Release Notes for information on new features and known issues.
Linking to a Second Life coordinate (NEW)
The gotoSLURL() global function enables the user to teleport to the specified x,y coordinates, given a valid SLMap instance. It first opens a window displaying the region name and a "Teleport" button, for example as shown at right.
For example, the following method call will pop-up the window illustrated here; the user can the click the "Teleport" button to open the Second Life Viewer and teleport to (997,1002).
<javascript>gotoSLURL(997,1002, mapInstance);</javascript>
The example code below provides several similar examples.
Source code
<html4strict> <script> var mapInstance; function loadmap() {
// creates the map mapInstance = new SLMap(document.getElementById('map-container')); mapInstance.centerAndZoomAtSLCoord(new XYPoint(997, 1002), 2);
} </script> </head> <body onload="loadmap()" onunload="GUnload()">
Click on these links to be teleported into Second Life via a SLURL:
<a href="javascript:gotoSLURL(997, 1002, mapInstance)"> Go to (997, 1002) </a>(where the welcome fountain is)
<a href="javascript:gotoSLURL(996.5, 1001.6, mapInstance)"> Go to (996.5, 1001.6) </a>
<a href="javascript:gotoSLURL(1000, 1000, mapInstance)"> Go to (1000, 1000) </a>
</body></html4strict>
Working with maps
The SLMap object provides a great deal of control over how you display and interact with the map. You can:
- Customize the zoom and pan controls.
- Disable and enable dragging the map.
- Pan/re-center the map to a specified location.
- Define event handler functions, called when:
- The user zooms or pans the map.
- The user clicks on the map.
- The user double-clicks on the map.
- Get the cooridnates of the map's center and bounds.
See Second Life Map API Examples to see these examples in action.
Customizing zoom and pan controls
It's easy to remove all the zoom and pan controls or create your own. When you create the SLMap object, simply specify false for the SLMapOptions properties hasZoomControls and hasPanningControls, for example:
<javascript>mapInstance = new SLMap(document.getElementById('map-container'),
{hasZoomControls: false, hasPanningControls: false});</javascript>
This code creates a map with no zoom and pan controls.
To create your own zoom controls use the SLMap methods:
- setCurrentZoomLevel()
- getCurrentZoomLevel()
- zoomIn()
- zoomOut()
To create your own panning controls, use the SLMap methods:
- panLeft()
- panRight()
- panUp()
- panDown()
The following example contains a set of anchored links that call a function when clicked.
Example source code
<html4strict> <script> var mapInstance;
function loadmap() {
// creates the map mapInstance = new SLMap(document.getElementById('map-container'), {hasZoomControls: false, hasPanningControls: false}); mapInstance.centerAndZoomAtSLCoord(new XYPoint(997, 1002), 2); (document.getElementById('zoom_level')).innerHTML = mapInstance.getCurrentZoomLevel();
}
function setZoom(level) {
mapInstance.setCurrentZoomLevel(level); (document.getElementById('zoom_level')).innerHTML = mapInstance.getCurrentZoomLevel();
}
function zoomIn() {
mapInstance.zoomIn(); (document.getElementById('zoom_level')).innerHTML = mapInstance.getCurrentZoomLevel();
}
function zoomOut() {
mapInstance.zoomOut(); (document.getElementById('zoom_level')).innerHTML = mapInstance.getCurrentZoomLevel();
} </script> </head> <body onload="loadmap()" onunload="GUnload()">
This map has the usual pan/zoom controls disabled, and the hyperlinks below implement custom pan/zoom controls via SLMap Javascript calls.
Set the zoom level
The Current Zoom Level is
<a href="javascript: setZoom(1);">1</a> <a href="javascript: setZoom(2);">2</a> <a href="javascript: setZoom(3);">3</a> <a href="javascript: setZoom(4);">4</a> <a href="javascript: setZoom(5);">5</a> <a href="javascript: setZoom(6);">6</a> <a href="javascript: setZoom(7);">7</a> <a href="javascript: setZoom(8);">8</a> <a href="javascript: zoomIn();">zoom in</a> <a href="javascript: zoomOut();">zoom out</a>
Pan Around
<a href="javascript: mapInstance.panLeft();">left</a>
<a href="javascript: mapInstance.panRight();">right</a>
<a href="javascript: mapInstance.panUp();">up</a>
<a href="javascript: mapInstance.panDown();">down</a>
</body></html4strict>
Disabling and enabling dragging
To disable dragging on the map, simply call disableDragging() on the map object.
<javascript>mapInstance.disableDragging();</javascript>
When you are done call enableDragging() on the map object to re-enable dragging.
Example source code
<html4strict> <script> var mapInstance;
function loadmap() {
mapInstance = new SLMap(document.getElementById('map-container')); mapInstance.centerAndZoomAtSLCoord(new XYPoint(997, 1002), 2);
}
</script> </head> <body onload="loadmap()" onunload="GUnload()">
<a href="javascript: mapInstance.disableDragging();">Click to disable dragging map</a>
<a href="javascript: mapInstance.enableDragging();">Click to enable dragging map</a>
</body></html4strict>
Panning or re-centering the map
Use the map object's panOrRecenterToSLCoord() method to pan the map to a specific point, providing the following parameters:
- An XYPoint object, that identifies a specific x, y point.
- Whether to recenter the map if the specified point is not currently visible. This parameter is optional and defaults to false.
For example:
<javascript>mapInstance.panOrRecenterToSLCoord(new XYPoint(1000, 1000), true);</javascript>
The above code pans or recenters the map to (1000, 1000) depending on the current view.
Example source code
<html4strict> <script> var mapInstance;
function loadmap() {
// creates the map mapInstance = new SLMap(document.getElementById('map-container')); mapInstance.centerAndZoomAtSLCoord(new XYPoint(998.5, 1001), 2); var mapWindow1 = new MapWindow("This is (997, 1002)"); var mapWindow2 = new MapWindow("This is (1000, 1000)"); var mapWindow3 = new MapWindow("This is (1010.5, 1000.5)"); mapInstance.addMapWindow(mapWindow1, new XYPoint(997, 1002)); mapInstance.addMapWindow(mapWindow2, new XYPoint(1000, 1000)); mapInstance.addMapWindow(mapWindow3, new XYPoint(1010.5, 1000.5));
}
</script> </head> <body onload="loadmap()" onunload="GUnload()">
Click the links to pan or re-center the map on the indicated co-ordinates:
<a href="javascript: mapInstance.panOrRecenterToSLCoord(new XYPoint(1000, 1000), true);"> Pan or recenter to (1000, 1000)</a>
<a href="javascript: mapInstance.panOrRecenterToSLCoord(new XYPoint(1010.5, 1000.5), true);"> Pan or recenter to (1010.5, 1000.5)</a>
</body></html4strict>
Setting the onStateChangedHandler event handler
The map object has an onStateChangedHandler option that is a function called whenever the user pans or zooms the map. Specify it in the options when you initially create the map object. For example:
<javascript>mapInstance = new SLMap(document.getElementById('map-container'), {onStateChangedHandler: doSomething});</javascript>
Whenever the user zooms or pans the map, the Map API will call the doSomething function.
This feature is handy when you want to show markers only currently in the user's viewport: in the event handler function, simply remove all the current markers, then place a new set of markers on the map based on the current map bounds.
Example source code
<html4strict> <script> function loadmap() {
// creates the map mapInstance = new SLMap(document.getElementById('map-container'), {onStateChangedHandler: doSomething}); mapInstance.centerAndZoomAtSLCoord(new XYPoint(997, 1002), 2);
} function doSomething() {
alert("The map state has changed!!");
} </script> </head> <body onload="loadmap()" onunload="GUnload()">
This map will display an alert whenever the map's state changes (i.e. the map is panned or zoomed)
</body></html4strict>
Setting click and double-click event handlers
You can define a double click event handler function, that gets called when the user double-clicks on the map. For example:
<javascript>// creates a function that we will bind to the double click action var doubleClickHandlerFunction = function(x,y) {
alert("you double clicked at (" + x + "," + y + ")");
};
var clickHandlerFunction = function(x,y) {
alert("you double clicked at (" + x + "," + y + ")");
};
// creates the map var mapInstance = new SLMap(document.getElementById('map-container'),
{doubleClickHandler: doubleClickHandlerFunction clickHandler: clickHandlerFunction});
mapInstance.centerAndZoomAtSLCoord(new XYPoint(997.5, 1001.5), 2);</javascript>
This does not appear to work currently.
The above code pops up a Javascript alert box showing the X and Y coordinate clicked. The X and Y coordinate will be passed as parameters to event handler functions. Is this still true?
Example source code
<html4strict> <script> function doubleClickHandlerFunction() {
alert("You double-clicked!")
}
function clickHandlerFunction() {
alert("You clicked!")
}
function loadmap() {
// creates the map var mapInstance = new SLMap(document.getElementById('map-container'), {doubleClickHandler: doubleClickHandlerFunction, clickHandler: clickHandlerFunction});
mapInstance.centerAndZoomAtSLCoord(new XYPoint(997, 1002), 2);
}
</script> <body onload="loadmap()" onunload="GUnload()">
There should be a yellow marker in the center of this map:
</body></html4strict>
Getting current map center and bounds
Use the map object's getViewportBounds() method to get the bounds of the map. This method returns a Bounds object that has xMin, xMax, yMin, and yMax properties for the current viewport. For example:
var bounds = mapInstance.getViewportBounds();
Use the map object's getMapCenter() method to get the coordinates of map. This method returns an XYPoint object representing the center of the map. For example:
var center = mapInstance.getMapCenter();
These methods are handy to display only markers inside the current map viewport, or display markers based on the proximity from the map center.
Example source code
<html4strict> <script> var mapInstance;
function loadmap() {
// creates the map mapInstance = new SLMap(document.getElementById('map-container')); mapInstance.centerAndZoomAtSLCoord(new XYPoint(998.5, 1001), 2); var mapWindow1 = new MapWindow("This is (997, 1002)"); var mapWindow2 = new MapWindow("This is (1000, 1000)"); var mapWindow3 = new MapWindow("This is (1020, 1020)"); mapInstance.addMapWindow(mapWindow1, new XYPoint(997, 1002)); mapInstance.addMapWindow(mapWindow2, new XYPoint(1000, 1000)); mapInstance.addMapWindow(mapWindow3, new XYPoint(1020, 1020)); checkBounds();
}
function checkBounds() {
var bounds = mapInstance.getViewportBounds(); var center = mapInstance.getMapCenter(); document.getElementById('cent').innerHTML = "(" + center.x + "," + center.y + ")"; document.getElementById('xMin').innerHTML = bounds.xMin; document.getElementById('xMax').innerHTML = bounds.xMax; document.getElementById('yMin').innerHTML = bounds.yMin; document.getElementById('yMax').innerHTML = bounds.yMax;
} </script> </head> <body onload="loadmap()" onunload="GUnload()">
Drag/zoom the map and then <a href="javascript: checkBounds();">click here</a> to check the current viewport bounds and center coordinate
Center:
X-Min:
X-Max:
Y-Min:
Y-Max:
</body></html4strict>
Working with markers
The Marker object displays a small image at a particular x, y point on the map.
See Second Life Map API Examples to see these examples in action.
Setting a marker's event handlers
The Marker object has three event handlers:
- clickHandler - function called when user clicks on the marker.
- mouseOverHandler - function called when user moves mouser pointer over marker.
- mouseOutHandler - function called when user moves mouse pointer off marker.
Set these event handlers to Javascript functions when you construct the Map object. For example:
<javascript>// creates a function that we will bind to the marker click action var doMarkerAction = function(marker) {
alert("an event occured at (" + marker.slCoord.x + "," + marker.slCoord.y + ")");
};
// creates the marker and sets its event handlers var marker = new Marker(all_images,
new XYPoint(997, 1002), {clickHandler: doMarkerAction, onMouseOutHandler: doMarkerAction, onMouseOverHandler: doMarkerAction});</javascript>
The code above simple sets all three event handlers of the marker to the doMarkerAction() function. The marker is passed as a parameter to this function.
Example source code
<html4strict><html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <style> div#map-container1 {
width: 400px; height: 400px;
}
div#map-container2 {
width: 400px; height: 400px;
} </style>
<script src="http://maps.google.com/maps?file=api&v=2&key=[GOOGLE MAP API KEY]"
type="text/javascript"></script>
<script src="http://slurl.com/_scripts/slmapapi.js" type="text/javascript"></script> <script> // mapInstance and marker is set as a global, so that the removeMarker function can access them var mapInstance, marker;
var myClickHandler = function(marker) {
alert("Click handler for marker at ("+ marker.slCoord.x + ", " + marker.slCoord.y + ")");
}
function loadmap() {
// create the icons for use as a marker var yellow_dot_image = new Img("b_map_yellow.gif", 9, 9); var yellow_icon = new Icon(yellow_dot_image); var all_images = [yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon]; // First map mapInstance1 = new SLMap(document.getElementById('map-container1')); mapInstance1.centerAndZoomAtSLCoord(new XYPoint(997, 1002), 2); // creates the marker marker1 = new Marker(all_images, new XYPoint(997, 1002)); mapInstance1.addMarker(marker1);
// Second map mapInstance2 = new SLMap(document.getElementById('map-container2')); mapInstance2.centerAndZoomAtSLCoord(new XYPoint(997, 1002), 2); // creates the marker marker2 = new Marker(all_images, new XYPoint(997, 1002), {clickHandler: myClickHandler}); mapInstance2.addMarker(marker2);
} </script> </head> <body onload="loadmap()" onunload="GUnload()">
No clickhandler (default):
Click handler installed:
</body></html4strict>
Removing a marker
Call the map object's removeMarker() method to remove a marker, passing the marker object as the parameter. For example:
<javascript>mapInstance.removeMarker(myMarker);</javascript>
The above code removes the marker myMarker.
Example source code
<html4strict><script> // mapInstance and marker are global, so removeMarker() can access them. var mapInstance, marker;
function loadmap() {
// Creates the map mapInstance = new SLMap(document.getElementById('map-container')); mapInstance.centerAndZoomAtSLCoord(new XYPoint(997, 1002), 2); // Creates the icons var yellow_dot_image = new Img("b_map_yellow.gif", 9, 9); var yellow_icon = new Icon(yellow_dot_image); var all_images = [yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon]; // Creates the marker marker = new Marker(all_images, new XYPoint(997, 1002)); mapInstance.addMarker(marker);
}
function removeMarker() {
// Removes the marker mapInstance.removeMarker(marker);
} </script> </head> <body onload="loadmap()" onunload="GUnload()"> <a href="javascript: removeMarker();">Click to remove the yellow marker from the map</a>
</body></html4strict>
Triggering a marker click
To simulate clicking on a marker, use the Map object's clickMarker() method, passing the marker as the parameter. For example:
mapInstance.clickMarker(marker);
This method can come in handy if you are listing links somewhere else on the page, and want links to open up markers with more information.
Creating markers with shadows
You can use a PNG image to make a marker appear to have a "shadow." To do this:
- Create two Img objects, one for the marker image and one for the shadow image.
- When creating the Img objects, provide "true" as the fourth argument to the constructor, indicating to create the image with an alpha channel (which provides transparency).
- When creating the Icon object, provide both Img objects as arguments to the constructor.
For example: <javascript>// creates the icons var forsale_sign = new Img("forsale.png", 80, 83, true); // note how the fourth parameter is set true! var forsale_shadow = new Img("forsale-shadow.png", 98, 83, true); var forsale_icon = new Icon(forsale_sign, forsale_shadow); var all_images = [forsale_icon, forsale_icon, forsale_icon, forsale_icon, forsale_icon, forsale_icon];
// creates the marker var marker = new Marker(all_images, new XYPoint(995, 1004)); mapInstance.addMarker(marker);</javascript>
Additional examples
See Second Life Map API Examples to see these examples in action.
Aligning marker images
<html4strict><html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <style> div#map-container1 {
width: 400px; height: 400px;
}
div#map-container2 {
width: 400px; height: 400px;
} </style>
<script src="http://maps.google.com/maps?file=api&v=2&key=[GOOGLE MAP KEY]"
type="text/javascript"></script>
<script src="http://slurl.com/_scripts/slmapapi.js" type="text/javascript"></script> <script> // mapInstance and marker is set as a glabal, so that the removeMarker function can access them var mapInstance, marker;
function loadmap() {
// create the icons for use as a marker var yellow_dot_image = new Img("b_map_yellow.gif", 9, 9); var yellow_icon = new Icon(yellow_dot_image); var all_images = [yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon]; // First map mapInstance1 = new SLMap(document.getElementById('map-container1')); mapInstance1.centerAndZoomAtSLCoord(new XYPoint(997, 1002), 2); // creates the marker marker1 = new Marker(all_images, new XYPoint(997,1002), {verticalAlign: "top", horizontalAlign: "left"}); mapInstance1.addMarker(marker1);
// Second map mapInstance2 = new SLMap(document.getElementById('map-container2')); mapInstance2.centerAndZoomAtSLCoord(new XYPoint(997, 1002), 2); // creates the marker marker2 = new Marker(all_images, new XYPoint(997,1002), {verticalAlign: "bottom", horizontalAlign: "right"}); mapInstance2.addMarker(marker2);
} </script> </head> <body onload="loadmap()" onunload="GUnload()">
Marker icon aligned to top-left:
Marker icon aligned to bottom-right:
</body></html4strict>
Centering the map on a marker when user clicks it
<html4strict><html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <style> div#map-container1 {
width: 400px; height: 400px;
}
div#map-container2 {
width: 400px; height: 400px;
} </style>
<script src="http://maps.google.com/maps?file=api&v=2&key=[GOOGLE MAP KEY]"
type="text/javascript"></script>
<script src="http://slurl.com/_scripts/slmapapi.js" type="text/javascript"></script> <script> // mapInstance and marker is set as a glabal, so that the removeMarker function can access them var mapInstance, marker;
function loadmap() {
// create the icons for use as a marker var yellow_dot_image = new Img("b_map_yellow.gif", 9, 9); var yellow_icon = new Icon(yellow_dot_image); var all_images = [yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon]; // First map mapInstance1 = new SLMap(document.getElementById('map-container1')); mapInstance1.centerAndZoomAtSLCoord(new XYPoint(996,1001),2); // creates the marker marker1 = new Marker(all_images, new XYPoint(997,1002)); mapInstance1.addMarker(marker1);
// Second map mapInstance2 = new SLMap(document.getElementById('map-container2')); mapInstance2.centerAndZoomAtSLCoord(new XYPoint(996,1001),2); // creates the marker marker2 = new Marker(all_images, new XYPoint(997,1002), {centerOnClick: true}); mapInstance2.addMarker(marker2);
} </script> </head> <body onload="loadmap()" onunload="GUnload()">
Clicking on this marker should have no effect:
Clicking on this marker should center the map on the marker:
</body></html4strict>
Controlling marker z-order
<html4strict><html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <style> div#map-container1 {
width: 400px; height: 400px;
}
div#map-container2 {
width: 400px; height: 400px;
} </style>
<script src="http://maps.google.com/maps?file=api&v=2&key=[GOOGLE MAP KEY]"
type="text/javascript"></script>
<script src="http://slurl.com/_scripts/slmapapi.js" type="text/javascript"></script> <script> // mapInstance and marker is set as a glabal, so that the removeMarker function can access them var mapInstance, marker;
function loadmap() {
// create the icons for use as a marker var marker1_image = new Img("marker_1.gif", 64, 64); var marker1_icon = new Icon(marker1_image); var marker1_images = [marker1_icon, marker1_icon, marker1_icon, marker1_icon, marker1_icon, marker1_icon]; var marker2_image = new Img("marker_2.gif", 64, 64); var marker2_icon = new Icon(marker2_image); var marker2_images = [marker2_icon, marker2_icon, marker2_icon, marker2_icon, marker2_icon, marker2_icon]; // First map var mapInstance1 = new SLMap(document.getElementById('map-container1')); mapInstance1.centerAndZoomAtSLCoord(new XYPoint(997, 1002), 2); // creates the marker var marker1a = new Marker(marker1_images, new XYPoint(997, 1002), {zLayer: 1}); mapInstance1.addMarker(marker1a);
var marker1b = new Marker(marker2_images, new XYPoint(997.15, 1002.15), {zLayer: 0}); mapInstance1.addMarker(marker1b);
// Second map mapInstance2 = new SLMap(document.getElementById('map-container2')); mapInstance2.centerAndZoomAtSLCoord(new XYPoint(997, 1002), 2); // creates the marker var marker2a = new Marker(marker1_images, new XYPoint(997, 1002), {zLayer: 0}); mapInstance2.addMarker(marker2a);
var marker2b = new Marker(marker2_images, new XYPoint(997.15, 1002.15), {zLayer: 1}); mapInstance2.addMarker(marker2b);
} </script> </head> <body onload="loadmap()" onunload="GUnload()">
The '1' marker icon should be on top of the '2' marker icon:
The '2' marker icon should be on top of the '1' marker icon:
</body></html4strict>
Removing all markers from a map
<html4strict><html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <style> div#map-container {
width: 500px; height: 500px;
} </style>
<script src="http://maps.google.com/maps?file=api&v=2&key=[GOOGLE MAP KEY]"
type="text/javascript"></script>
<script src="http://slurl.com/_scripts/slmapapi.js" type="text/javascript"></script> <script> // mapInstance and marker is set as a glabal, so that the removeMarker function can access them var mapInstance, marker;
function loadmap() {
// creates the map mapInstance = new SLMap(document.getElementById('map-container')); mapInstance.centerAndZoomAtSLCoord(new XYPoint(997, 1002), 2); // creates the icons var yellow_dot_image = new Img("b_map_yellow.gif", 9, 9); var yellow_icon = new Icon(yellow_dot_image); var all_images = [yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon, yellow_icon]; // creates the markers var marker = new Marker(all_images, new XYPoint(997,1002)); mapInstance.addMarker(marker); marker = new Marker(all_images, new XYPoint(997.4,1002)); mapInstance.addMarker(marker); marker = new Marker(all_images, new XYPoint(997.2,1002.8)); mapInstance.addMarker(marker); marker = new Marker(all_images, new XYPoint(997.8,1002.2)); mapInstance.addMarker(marker); marker = new Marker(all_images, new XYPoint(997.1,1002.65)); mapInstance.addMarker(marker);
}
function removeAllMarkers() {
// removes all the the marker mapInstance.removeAllMarkers();
} </script> </head> <body onload="loadmap()" onunload="GUnload()"> <a href="javascript: mapInstance.removeAllMarkers();">Click to remove all the markers</a>
</body></html4strict>
Example source code
<html4strict> <script> function loadmap() {
// creates the map var mapInstance = new SLMap(document.getElementById('map-container')); mapInstance.centerAndZoomAtSLCoord(new XYPoint(995,1004),2); // creates the icons var forsale_sign = new Img("forsale.png",80,83, true); var forsale_shadow = new Img("forsale-shadow.png", 98, 83, true); var forsale_icon = new Icon(forsale_sign, forsale_shadow); var all_images = [forsale_icon, forsale_icon, forsale_icon, forsale_icon, forsale_icon, forsale_icon]; // creates the marker var marker = new Marker(all_images, new XYPoint(995, 1004)); mapInstance.addMarker(marker);
} </script> </head> <body onload="loadmap()" onunload="GUnload()">
The map shows a 'for sale' sign marker with smooth edges, and an anti-aliased shadow.
</body></html4strict>