FSMS 70th Annual
Conference
Join us August 14-17, 2024 at the Hyatt Regency Coconut Point Resort & Spa in Bonita Springs, FL
About the Conference
The FSMS Annual Conference is Florida's premier event for surveying and mapping professionals, featuring educational sessions, networking opportunities, and the latest industry innovations.
Conference Schedule
Wednesday, August 14
Registration & Welcome Reception
Thursday, August 15
Educational Sessions & Exhibition
Friday, August 16
Continued Sessions & Annual Banquet
Saturday, August 17
Closing Sessions & Farewell Brunch
Registration Options
Full Conference
Access to all conference sessions, exhibitions, and social events
Register Now
One Day Pass
Access to all activities for your selected day
Select Day
Exhibition Only
Access to the exhibition hall only
Get Pass
Location
Hyatt Regency Coconut Point Resort & Spa
5001 Coconut Road, Bonita Springs, FL 34134
2024 Florida Surveying and Mapping Society. All rights reserved.
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
document.querySelector(this.getAttribute('href')).scrollIntoView({
behavior: 'smooth'
});
});
});
const GRID_SIZE = 50;
const MEASUREMENT_POINTS = 15;
const LASER_COLOR = 0xff0000;
const ANIMATION_SPEED = 0.005;
const LASER_PULSE_DURATION = 300;
const MEASUREMENT_SETS = 5;
const POINTS_PER_SET = 5;
const TERRAIN_RESOLUTION = 64;
const TERRAIN_HEIGHT_SCALE = 3;
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer({
alpha: true
});
renderer.setSize(window.innerWidth, window.innerHeight);
document.getElementById('surveying-simulation').appendChild(renderer.domElement);
function createTripod() {
const group = new THREE.Group();
const legGeometry = new THREE.CylinderGeometry(0.02, 0.03, 2, 16);
const legMaterial = new THREE.MeshStandardMaterial({
color: 0x888888,
metalness: 0.9,
roughness: 0.1,
envMap: null
});
for (let i = 0; i < 3; i++) {
const leg = new THREE.Mesh(legGeometry, legMaterial);
leg.position.x = Math.cos(i * Math.PI * 2 / 3);
leg.position.z = Math.sin(i * Math.PI * 2 / 3);
leg.rotation.x = Math.PI / 6;
leg.rotation.z = i * Math.PI * 2 / 3;
const jointGeometry = new THREE.SphereGeometry(0.04, 12, 12);
const joint = new THREE.Mesh(jointGeometry, legMaterial);
joint.position.y = 0.8;
leg.add(joint);
const innerLegGeometry = new THREE.CylinderGeometry(0.015, 0.02, 0.8, 16);
const innerLeg = new THREE.Mesh(innerLegGeometry, legMaterial);
innerLeg.position.y = -0.4;
leg.add(innerLeg);
const footGeometry = new THREE.CylinderGeometry(0.08, 0.08, 0.05, 8);
const foot = new THREE.Mesh(footGeometry, legMaterial);
foot.position.y = -0.95;
leg.add(foot);
group.add(leg);
}
const instrumentGroup = new THREE.Group();
const baseGeometry = new THREE.CylinderGeometry(0.2, 0.2, 0.1, 16);
const baseMaterial = new THREE.MeshPhongMaterial({
color: 0x444444
});
const base = new THREE.Mesh(baseGeometry, baseMaterial);
instrumentGroup.add(base);
const platformGeometry = new THREE.CylinderGeometry(0.15, 0.15, 0.15, 16);
const platform = new THREE.Mesh(platformGeometry, baseMaterial);
platform.position.y = 0.125;
instrumentGroup.add(platform);
const levelBubbleGeometry = new THREE.SphereGeometry(0.05, 16, 16);
const glassMaterial = new THREE.MeshPhysicalMaterial({
color: 0xffffff,
transmission: 0.9,
transparency: 1,
metalness: 0,
roughness: 0
});
const levelBubble = new THREE.Mesh(levelBubbleGeometry, glassMaterial);
levelBubble.position.y = 0.4;
instrumentGroup.add(levelBubble);
const displayGeometry = new THREE.BoxGeometry(0.2, 0.1, 0.05);
const displayMaterial = new THREE.MeshBasicMaterial({
color: 0x00ff00
});
const display = new THREE.Mesh(displayGeometry, displayMaterial);
display.position.set(0.2, 0.4, 0);
instrumentGroup.add(display);
const telescopeGroup = new THREE.Group();
const scopeGeometry = new THREE.CylinderGeometry(0.05, 0.07, 0.4, 12);
const scope = new THREE.Mesh(scopeGeometry, baseMaterial);
scope.rotation.z = Math.PI / 2;
telescopeGroup.add(scope);
const eyepieceGeometry = new THREE.CylinderGeometry(0.03, 0.03, 0.1, 8);
const eyepiece = new THREE.Mesh(eyepieceGeometry, baseMaterial);
eyepiece.position.x = 0.25;
eyepiece.rotation.z = Math.PI / 2;
telescopeGroup.add(eyepiece);
telescopeGroup.position.y = 0.3;
instrumentGroup.add(telescopeGroup);
instrumentGroup.position.y = 1.5;
group.add(instrumentGroup);
group.telescopeGroup = telescopeGroup;
group.platform = platform;
return group;
}
function createTerrain() {
const geometry = new THREE.PlaneGeometry(GRID_SIZE, GRID_SIZE, TERRAIN_RESOLUTION, TERRAIN_RESOLUTION);
const material = new THREE.MeshStandardMaterial({
color: 0x1a4d1a,
wireframe: true,
side: THREE.DoubleSide,
metalness: 0.2,
roughness: 0.8
});
const terrain = new THREE.Mesh(geometry, material);
terrain.rotation.x = -Math.PI / 2;
terrain.position.y = -2;
const vertices = geometry.attributes.position.array;
for (let i = 0; i < vertices.length; i += 3) {
const x = vertices[i] / GRID_SIZE;
const z = vertices[i + 2] / GRID_SIZE;
vertices[i + 2] = (Math.sin(x * 5) * Math.cos(z * 5) + Math.sin(x * 10) * Math.cos(z * 10) * 0.5 + Math.sin(x * 20) * Math.cos(z * 20) * 0.25) * TERRAIN_HEIGHT_SCALE;
}
geometry.attributes.position.needsUpdate = true;
return terrain;
}
function createMeasurementPoints() {
const points = new THREE.Group();
const setRadius = GRID_SIZE * 0.3;
for (let set = 0; set < MEASUREMENT_SETS; set++) {
const setGroup = new THREE.Group();
const centerX = (Math.random() - 0.5) * GRID_SIZE * 0.4;
const centerZ = (Math.random() - 0.5) * GRID_SIZE * 0.4;
for (let i = 0; i < POINTS_PER_SET; i++) {
const angle = i / POINTS_PER_SET * Math.PI * 2;
const radius = setRadius * (0.5 + Math.random() * 0.5);
const geometry = new THREE.SphereGeometry(0.1, 12, 12);
const material = new THREE.MeshStandardMaterial({
color: 0xffff00,
emissive: 0x444400
});
const point = new THREE.Mesh(geometry, material);
point.position.x = centerX + Math.cos(angle) * radius;
point.position.z = centerZ + Math.sin(angle) * radius;
point.position.y = -1.8 + Math.random() * 0.4;
const stakeGeometry = new THREE.CylinderGeometry(0.02, 0.02, 0.5, 8);
const stake = new THREE.Mesh(stakeGeometry, new THREE.MeshStandardMaterial({
color: 0xcc8866
}));
stake.position.y = -0.25;
point.add(stake);
setGroup.add(point);
}
points.add(setGroup);
}
return points;
}
function createLaser() {
const geometry = new THREE.CylinderGeometry(0.01, 0.01, 1, 8);
const material = new THREE.MeshBasicMaterial({
color: LASER_COLOR,
transparent: true,
opacity: 0.7
});
const laser = new THREE.Mesh(geometry, material);
laser.visible = false;
return laser;
}
const ambientLight = new THREE.AmbientLight(0x404040);
scene.add(ambientLight);
const directionalLight = new THREE.DirectionalLight(0xffffff, 1);
directionalLight.position.set(5, 5, 5);
scene.add(directionalLight);
const tripod = createTripod();
const terrain = createTerrain();
const measurementPoints = createMeasurementPoints();
const laser = createLaser();
scene.add(tripod);
scene.add(terrain);
scene.add(measurementPoints);
tripod.add(laser);
camera.position.set(8, 5, 8);
camera.lookAt(0, 0, 0);
function animate() {
requestAnimationFrame(animate);
const time = Date.now() * ANIMATION_SPEED;
const currentSet = Math.floor(time / 10) % MEASUREMENT_SETS;
const currentPoint = Math.floor(time) % POINTS_PER_SET;
const targetPoint = measurementPoints.children[currentSet].children[currentPoint];
tripod.platform.rotation.y = time * 2;
tripod.telescopeGroup.rotation.z = Math.PI / 2 + Math.sin(time * 0.5) * 0.2;
if (targetPoint) {
laser.visible = true;
laser.lookAt(targetPoint.position);
const distance = tripod.position.distanceTo(targetPoint.position);
laser.scale.y = distance;
laser.position.y = -distance / 2;
laser.material.opacity = Math.sin(time * 20) * 0.3 + 0.7;
targetPoint.material.emissiveIntensity = (Math.sin(time * 20) + 1) / 2;
setTimeout(() => {
targetPoint.material.emissiveIntensity = 0;
laser.visible = false;
}, LASER_PULSE_DURATION);
}
terrain.geometry.attributes.position.array.forEach((val, idx) => {
if (idx % 3 === 2) {
terrain.geometry.attributes.position.array[idx] += Math.sin(time + idx) * 0.01;
}
});
terrain.geometry.attributes.position.needsUpdate = true;
renderer.render(scene, camera);
}
animate();
function initMap() {
const hotelLocation = {
lat: 26.3391,
lng: -81.8372
};
const map = new google.maps.Map(document.getElementById('map'), {
zoom: 15,
center: hotelLocation,
styles: [{
elementType: "geometry",
stylers: [{
color: "#242f3e"
}]
}, {
elementType: "labels.text.stroke",
stylers: [{
color: "#242f3e"
}]
}, {
elementType: "labels.text.fill",
stylers: [{
color: "#746855"
}]
}, {
featureType: "administrative.locality",
elementType: "labels.text.fill",
stylers: [{
color: "#d59563"
}]
}, {
featureType: "poi",
elementType: "labels.text.fill",
stylers: [{
color: "#d59563"
}]
}, {
featureType: "poi.park",
elementType: "geometry",
stylers: [{
color: "#263c3f"
}]
}, {
featureType: "poi.park",
elementType: "labels.text.fill",
stylers: [{
color: "#6b9a76"
}]
}, {
featureType: "road",
elementType: "geometry",
stylers: [{
color: "#38414e"
}]
}, {
featureType: "road",
elementType: "geometry.stroke",
stylers: [{
color: "#212a37"
}]
}, {
featureType: "road",
elementType: "labels.text.fill",
stylers: [{
color: "#9ca5b3"
}]
}, {
featureType: "water",
elementType: "geometry",
stylers: [{
color: "#17263c"
}]
}]
});
const marker = new google.maps.Marker({
position: hotelLocation,
map: map,
title: 'Hyatt Regency Coconut Point Resort & Spa'
});
const infoWindow = new google.maps.InfoWindow({
content: '<div style="color: black;">Hyatt Regency Coconut Point<br>5001 Coconut Rd, Bonita Springs, FL 34134'
});
marker.addListener('click', () => {
infoWindow.open(map, marker);
});
}
initMap();
if (navigator.geolocation) {}
window.addEventListener('resize', () => {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
});
Enclosure: https://landsurveyorsunited.com/events/fsms-70th-annual-conference