How to Run Drone Operations at a Small to Medium-Sized Engineering Firms

“Waste… waste is the worst part about construction! If equipment is not running or people are waiting for information to get started, we lose money. Changing this is what motivated me to start a career in the construction business,” explained Colin See, when asked why he started to work with Bogh Engineering and use drones for construction.

Colin is currently studying construction management at the University of Redlands, and he interns at Bogh two days a week. When Mark Bogh, owner and 30 year industry veteran, purchased Site Scan, he immediately advised Colin to take the FAA Part 107 remote pilot test and get certified to fly drones on-site. “When we introduce a new technology at the company, I want one person to initially own it. Colin was the perfect fit. Eventually, my goal is to have everyone at the company instructed to use any tool we have.” Mark said.

For Bogh, the advantage of drone surveying is the speed and frequency of data collection. With traditional topographic surveying, they needed two days of lead time and 1–2 days in the field to collect the data. Additionally, they had to manually process the data in Civil 3D, pushing back the final deliverable so it was only ready a week after it was initially requested. “With Site Scan, I can tell Colin to fly a site in the morning and we have the data completely processed in the afternoon,” Mark said. Our success story goes in-depth into how Site Scan helped drive ROI for Bogh.

The first assignment for Colin

One morning in February 2017, Mark asked Colin to survey the Indio High School construction site before the company started grading. He arrived at the site at 9:00 am, and before flying the drone he measured ground control points (GCPs) so that the drone data could be georeferenced and used for cut-and-fill analysis. The GCPs had already been marked on the ground with an orange X in an earlier phase of the project, so all that Colin had to do was walk to the marked signs and measure the coordinates of each point with a total station [Image 1]. To walk throughout the 17 acre site and collect the coordinates of all 10 GCPs took Colin less than half an hour.

Image 1: Colin measuring the coordinates of GCPs before the drone flights.

At this point, Colin informed the other construction crew members that he was about to fly the drone. He opened the hard case in the back of his truck, took out the Site Scan drone, started mounting the propellers, and inserted the charged battery. He then turned on the drone, the controller, and his iPad. In less than a minute, Colin connected and started planning the flight.

Image 2: Colin mounting the propellers on the Site Scan drone.

On this day, he was assigned to collect data for an orthomosaic view and a 3D point cloud, so decided to fly a crosshatch survey to do so. He opened the Site Scan Field app on his iPad and selected the crosshatch flight mode. In this mode, the drone flies two autonomous surveys perpendicular to each other, with the camera pointed at an oblique angle. This ensures the collection of the highest possible detail and oblique images for the 3D model. He used the iPad to select the area he wanted to fly with a couple of taps on the mission planning screen [Image 3]. From the preloaded Google Maps, he immediately recognized the site and had no problem identifying the area he needed to survey. The app automatically calculated the optimal flight path to cover the area Colin selected.

Sample crosshatch flight on the Site Scan Field app

The flight

Liftoff with Bogh Engineering

To start the flight, Colin positioned the drone 20 feet away from his truck, stepped back a couple of feet, and tapped “Fly Survey” on the iPad. The drone took off and follows the planned path. Some construction workers close to Colin followed the drone in the sky, but with graders and dozers running, almost no one else noticed the drone. Colin kept an eye on the drone and monitored flight progress on his iPad.

Image 4: Colin monitoring the drone flight on his iPad.

Given the large area and the fact that the drone needed to fly two perpendicular surveys, the app indicated that the flight needed 3 batteries to complete. Once the first battery ran too low, the Site Scan app notified Colin and the drone automatically flew back for the battery exchange. He went back to the truck, picked up a charged battery from the case, and returned to the drone, which had just safely landed.

Image 5: Replacing the battery and automatically resuming the flight

Completing the survey

He swapped the batteries, powered the Site Scan drone up again, and tapped “Continue Survey” on the iPad. In less than a minute from when it landed, the drone was back in the air and continuing the survey as it left off. Colin repeated the same steps one more time before the drone finally completed the survey. In total, the scan took approximately 35 minutes to complete, and it captured 410 images.

After the final landing, Colin brought the drone back to the truck, unscrewed the propellers, and downloaded the images from the drone to the iPad. This was done with a simple tap on the “Download Images” button. The images were then wirelessly transferred to the iPad [Image 6] without using any SD cards, and the operation took about 10 minutes.

Image 6: Images are downloaded from the drone to the iPad wirelessly with the tap of a button

At this point, all of the necessary data has been collected and secured. Back in the office, Colin uploaded the data to the 3DR cloud for processing and finally handed the orthomosaics and 3D point clouds over to the staff engineer for analysis. “We are looking for an LTE card for the iPad, so that we can already upload the data while I’m still in the field. This would make it even quicker.”

It’s 10:15 am. Colin’s phone rings, and it’s Mark calling. “I have to survey a site in Beaumont before lunch. I’m heading over now. Do you want to join?”


Want to learn more about Site Scan?

Sign up for our newsletter

Get our latest stories on drones and construction.

Thanks for signing up. Now, check out some stories while you're here!

tag * ppcUrlCookiePart1 and ppcUrlCookiePart2 must be called, see bottom of script * update ppcUrlCookiePart2 and ppcUrlCookiePart2 to match your querystring and form field names * */ //Leave this as true to always use querystring values if they exist, if no querystring will attempt to get cookie values var ppcUseLatestValues = true; //set this to false to use cookie values if they exist (if false, will not check querystring first). //function to grab params from cookie function getCookie(param_name) { var i, x, y, cookie = document.cookie.split(";"); for (i = 0; i < cookie.length; i++) { x = cookie[i].substr(0, cookie[i].indexOf("=")); y = cookie[i].substr(cookie[i].indexOf("=") + 1); x = x.replace(/^\s+|\s+$/g, ""); if (x == param_name) { return unescape(y); } } } //function to create cookie function setCookie(param_name, value, exdays) { var exdate = new Date(); exdate.setDate(exdate.getDate() + exdays); //CHANGE DOMAIN BELOW TO MATCH SITE var c_value = escape(value) + ((exdays == null) ? "" : ";; path=/; expires=" + exdate.toUTCString()); document.cookie = param_name + "=" + c_value; } //function to check if cookie exists and, if so, run the setCookie function function checkCookie(param_name, param_url_name) { var param_value = getCookie(param_name); if ((param_value != null && param_value != "" && param_value != "undefined") && ppcUseLatestValues == false) { //this means the param name/value pair exists - and we don't want to use latest } else { //this means the param name/value pair does not exist - so create it //grab values from URL var pageURL =; var URLVariables = pageURL.split('&'); for (var i = 0; i < URLVariables.length; i++) { var parameterName = URLVariables[i].split('='); if (parameterName[0] == param_url_name) { //filter out "#" in case that is in the last URL param param_value = decodeURIComponent(parameterName[1].split("#")[0]); } } if (param_value != "undefined" && param_value != "" && param_value != null) { //create cookie setCookie(param_name, param_value, 365); } } } //function to setup the parameters and save the cookie values function ppcUrlCookiePart1() { //setup list/array of parameters desired. names on right should match querystring names var param_names = new Array( 'utm_source;utm_source', 'utm_medium;utm_medium', 'utm_campaign;utm_campaign', 'utm_term;utm_term', 'utm_content;utm_content' ); //loop through all params and create cookie for (i = 0; i < param_names.length; i++) { var param_object = param_names[i].split(";");//split out the cookie name and url name var param_name = param_object[0]; var param_url_name = param_object[1]; //start the cookie creation checkCookie(param_name, param_url_name); } } //function to grab cookie params function mGetCookie(param_name) { var i, x, y, cookie = document.cookie.split(";"); for (i = 0; i < cookie.length; i++) { x = cookie[i].substr(0, cookie[i].indexOf("=")); y = cookie[i].substr(cookie[i].indexOf("=") + 1); x = x.replace(/^\s+|\s+$/g, ""); if (x == param_name) { return unescape(y); } } } //function to check if cookie exists and, if so, fill out the corresponding form fields function mCheckCookie(param_name, param_field_name) { var param_value = mGetCookie(param_name); if (param_value != null && param_value != "" && param_value != "undefined") { try { var obj1 = document.getElementsByName(param_field_name); obj1[0].value = param_value; return true; } catch (err) { return false; } } return false; } //function to setup parameters and begin cookie value insertion into marketo form function ppcUrlCookiePart2() { //setup list/array of parameters desired. names on right should match hidden form field names var param_names = new Array( 'utm_source;Lead Source Name (Last Touch)', 'utm_medium;Lead Source Last Touch', 'utm_campaign;Lead Campaign (Last Touch)', 'utm_term;Lead Campaign Term (Last Touch)', 'utm_content;Lead Campaign Content (Last Touch)' ); //loop through all params and create cookie for (i = 0; i < param_names.length; i++) { var param_object = param_names[i].split(";");//split out the cookie name and url name var param_name = param_object[0]; var param_field_name = param_object[1]; //start the cookie creation mCheckCookie(param_name, param_field_name); } } //ppcUrlCookiePart1 will grab values from the querystring and save them in cookies ppcUrlCookiePart1(); //ppcUrlCookiePart2 will retrive values from the cookies and populate the hidden form fields - should be in the onload try { //attempt for Marketo form MktoForms2.whenReady(function (form){ ppcUrlCookiePart2(); }); } catch (err) { //if error on Marketo form, try loading for regular form. ppcUrlCookiePart2(); }