HUMAN COMPUTER INTERACTION SYSTEM

FOR SELF-DRIVEN CART

A Project

Presented to the

Faculty of

California State Polytechnic University, Pomona

In Partial Fulfillment

Of the Requirements for the Degree

Master of Science

In

Computer Science

By

Hardeep Singh

2018

SIGNATURE PAGE

PROJECT: HUMAN COMPUTER INTERACTION SYSTEM FOR SELF-DRIVEN

AUTHOR: Hardeep Singh

DATE SUBMITTED: Spring 2018

Computer Science Department

Dr. Amar Raheja Project Committee Chair Professor of Computer Science

Dr. Daisy Tang Project Committee Member Professor of Computer Science

ii

ABSTRACT

In this era of machine learning and sensors, goal of industry is to make faster computers capable of performing high end tasks without human interaction. Autonomous computers are being developed to perform human-like tasks, with hope to eliminate human errors.

Among the many tasks performed by humans every day, an absolutely necessary task is operating a machine for transportation. Autonomous vehicles are being built around the globe to provide better and safer transportation for passengers. In the attempt to utilize modern technologies and striving for safer environment, Cal Poly Pomona is developing a self-driving golf cart, to passengers/visitors around campus. However, removing human interaction completely from golf-cart pose a great risk. An autonomous machine can navigate through pre-programmed scenarios, but it will always lack the ability to make human decisions. Therefore, in this research, an on-board computer is built to provide passengers with human-computer interaction platform. On-board computer consists multiple human interaction techniques (verbally or physical) along with vehicles movement information during a transit. Human computer interface features active route selection, path planning and navigation updates on map, to provide passengers with updates during their commute. On-board computer also provides basic vehicle directing controls, allowing passengers to maintain control over autonomous machine actions, at all times.

These features along with Android sensory data and Google location updates, allow on- board computer to provide a better and safer transit for its passengers.

iii

TABLE OF CONTENTS

SIGNATURE PAGE ...... ii ABSTRACT ...... iii LIST OF FIGURES ...... vi CHAPTER 1 INTRODUCTION ...... 1 CHAPTER 2 LITERATURE SURVEY ...... 3 2.1 VOICE RECOGNITION ...... 3 2.1.1 USER TO ROBOT SPEECH MODEL STRUCTURE ...... 3 2.1.2 TYPE OF SPEECH RECOGNITION ...... 5 2.1.3 GOOGLE VOICE RECOGNITION...... 7 2.2 USER INTERFACE (MANUEL SELECTION) ...... 8 2.2.1 USER SELECTION OPTIONS ...... 8 2.2.2 USER NAVIGATION OPTIONS ...... 8 2.3 GOOGLE MAP ...... 9 CHAPTER 3 PROJECT GOAL ...... 11 CHAPTER 4 METHODOLOGY ...... 13 4.1 PROVIDED DATA/PREPROCESSING ...... 13 4.2 APPROACH ...... 13 4.2.1 DATA BINDINGS ...... 13 4.2.2 PARSE BUILDING DATA XML ...... 15 4.2.3 SPEECH TO TEXT CONVERTOR ...... 17 4.2.4 TEXT TO SPEECH CONVERTOR ...... 21 4.2.5 GOOGLE LOCATION UPDATES ...... 24 4.2.6 GOOGLE MAPS PATH PLANNING ...... 26 4.2.7 SERVER PATH PLANNING ...... 30 4.2.8 SIMULATOR ...... 32 CHAPTER 5 DATA FLOWS ...... 34 5.1 GOOGLE MAP PATH WITH ACTIVE LOCATION UPDATES ...... 34 5.2 GOOGLE MAP PATH WITH SIMULATED LOCATION UPDATES ...... 35 5.3 FILE PROVIDED PATH WITH ACTIVE LOCATION UPDATES ...... 36 5.4 FILE PROVIDED PATH WITH SIMULATED LOCATION UPDATES ...... 37 CHAPTER 6 RESULTS ...... 38 6.1 SELECTION/MAIN SCREEN ...... 38 6.1.1 OPTIONS ...... 39 6.2 NAVIGATION SCREEN ...... 48 6.2.1 TRANSIT ...... 48 CHAPTER 7 EVALUATION OF RESULTS ...... 56 7.1 APPROACH ...... 56 7.2 RESULTS ...... 58 CHAPTER 8 FUTURE WORKS ...... 59 8.1 Enhanced Speech Recognition ...... 59

iv

REFERENCES ...... 60 APPENDIX ...... 62

v

LIST OF FIGURES

Figure 1. Speech to Robot Command ...... 4

Figure 2. Data flow with Google Maps path and active location updates ...... 34

Figure 3. Data flow with Google Maps path and simulated location updates ...... 35

Figure 4. Data flow with way-point file path and active location updates ...... 36

Figure 5. Data flow with way-point file path and simulated location updates ...... 37

Figure 6. Main screen of application...... 39

Figure 7. Search Bar usuage ...... 40

Figure 8. Default Google speech recognition dialog ...... 41

Figure 9. A confirmation dialog to confirm user selection by speech or touch ...... 42

Figure 10. Map view when building is selected ...... 42

Figure 11. Bottom panel when building is selected ...... 43

Figure 12. Map view when building is not selected ...... 43

Figure 13. Bottom panel when building is not selected ...... 43

Figure 14. Building information list view ...... 44

Figure 15. A confirmation dialog to confirm user selection by speech or touch...... 44

Figure 16. Map view when building is selected ...... 45

Figure 17. Bottom panel when building is selected ...... 45

Figure 18. Map view when building is not selected ...... 46

Figure 19. Bottom panel when building is not selected ...... 46

Figure 20. Bottom panel building selected (before start over action) ...... 46

Figure 21. Bottom panel with start over action ...... 47

Figure 22. Different transit options ...... 47

vi Figure 23. Launch panel ...... 48

Figure 24. Launch screen action buttons ...... 49

Figure 25. In-route panel ...... 49

Figure 26. In-route action button ...... 49

Figure 27. Destination arrived panel with action button ...... 50

Figure 28. Google map path and active location updates, launch screen...... 51

Figure 29. Google map path and active location updates, in-route screen ...... 51

Figure 30. Google map path and simulated location updates, launch screen ...... 52

Figure 31. Google map path and simulated location updates, in-route screen ...... 52

Figure 32. Way-point file path and active location updates, launch screen ...... 53

Figure 33. Way-point file path and active location updates, in-route screen ...... 53

Figure 34. Way-point file path and simulated location updates, launch screen ...... 54

Figure 35. Way-point file path and simulated location updates, in-route screen ...... 54

Figure 36. Destination reached panel ...... 55

vii CHAPTER 1

INTRODUCTION

In this era of machine learning and sensors, goal of the industry is to make faster computers capable of performing high end tasks without human interaction. New autonomous computers, also known as robots are being developed to perform human-like tasks, with hope to eliminate human errors. Among the many tasks performed by humans every day, a most dangerous and necessary task is driving. Weather its driving a car or a work vehicle, it is absolute essential as mean of transportation. As the era of robotics grow, demand for autonomous vehicle raises, with a hope to eliminate human error. However, removing human interaction entirely from driving pose a greater risk than allowing full human interaction. Autonomous machines can drive vehicles but without small human interaction, machine will always lack the ability to make human decisions, human conscious. (Churchill, Bowser, Preece 2013) For example: best route might not be safest route, and optimal speed might not be the most suitable speed for current passenger or driver. The problem of preventing the complete elimination of human conscious from autonomous vehicles can be solved by providing an onboard interface will allows human to alter machine decisions when necessary. A HCI (Human Computer Interaction) interface, embedded within an autonomous machine or vehicles, allows humans to oversee every task performed by the robot. Even though, autonomous vehicles are assigned to drive automatically, a human interaction will give user the flexibility to decide the routes, destination and speed for best and efficient results.

HCI requires easy and fast accessible interface, allowing prompt modification to machine computed tasks. HCI systems demands to inherit the most common way of human

1 interaction, speech. Speech serve as crucial factor in HCI’s, allowing user to verbally express their commands and concern to machine. However, given the diversity among humans, everyone speaks and express differently which occasionally makes interaction very difficult with machine. (Shrivastava, Singhal, Das, Nair 2013) To avoid speech recognition issue, a touch interface is also considered for HCI interface. Touch interface ensures the accuracy and safety of the users. HCI model require the need of navigation layout, to provide information as the vehicle progress through its tasks.

2 CHAPTER 2

LITERATURE SURVEY

HCI have rich theoretical history across a variety of domains: machine learning, artificial intelligence, sensor recognition, remote sensing, voice recognition, vehicle operation, machine operation, cognitive theories and interfaces.

2.1 VOICE RECOGNITION

From a high vantage point, there are many type of voice recognition systems, each excelling in specific feature. However, all the voice recognition relies on model-based approach using machine learning.

2.1.1 USER TO ROBOT SPEECH MODEL STRUCTURE

Speech recognition (SR) is a crucial part of this HCI providing the ability to interact with robot verbally. User will have the ability to speak destination (“Building 8”, “Building 10”, so on) and golf cart will calculate the path and execute the transport. However, taking a command from user and then conveying it to robot requires multiple steps. These steps require the use of network, speech server, database and tablet UI, to perform efficiently.

SR program has set architecture which ensure the best results with multiple speech dialogues.

3

Figure 1. Speech to Robot Command

In this architecture user side application on tablet capture the user input and transmit raw input to speech recognition server (SRS: Julius). This robot server is independent from the server that connect with user application. (Shrivastava, Singhal, Das, Nair 2013) Julius is an open source server tool which receives transmitted audio in small data packages. There are many open source speech recognition program and can be used to replace Julius, for example Google Speech Recognition. SRS can be used as library within user side application and it can decipher audio from audio file or microphone. Once SRS break down the audio, it transmits the recognized speech text to bridge application. Bridge application is considered mid-way break point between robot and user provided commands. The bridge application ensure robot is connected and working before any commands are sent over the

4 network. (Shrivastava, Singhal, Das, Nair 2013) In golf cart, this is crucial because if robot is not replying, an automatic stop commands can be executed to ensure the safety of the passenger. As bridge application receive an acknowledgment, commands are transmitted to bridge application. Bridge application holds the context-free grammar of the commands.

Therefore, these commands can be broken down into small context-free grammar to be linked with opcode within robot. Bridge application transmit each command, word by word to robot-relay server in opcode. Robot-relay forwards the opcode to robot and shut down the network till commands are being executed. (Shrivastava, Singhal, Das, Nair 2013)

During execution an acknowledgement is sent back to server to indicate progress. This progress will be used update the status on the map and to insure stop when pedestrians are detected as an obstacle. The entire speech recognition architecture is acknowledged based, which allows the flexibility to perform checks, on each part of program. Acknowledgments also help ensure STOP’s when no acknowledgment is detected by the server for certain period. This helps assume, robot require re-direction and have lost its way. SRS also provide the flexibility to run multiple commands together, without disrupting the original/main tasks. (Constantine 2001) This will give user the ability to control the robot entirely by speech, if user senses, a stop or turn is required.

2.1.2 TYPE OF SPEECH RECOGNITION

Speech Recognition Models are trained using multiple language patterns and dialects.

These models seek the word sequence W which is most likely to produce from acoustic evidence A (Young, Barnard 1987)

5

Equation 1. Speech Recognition Model Learning Equation

Command Based Voice Recognition

Use audibly provided commands to a computer system, this allows the activation of specific functions when specific commands are spoken. For example, “OPEN” or

“CLOSE”. CBVR is limited to few words and can be combined with identifiers that are added to dictionary using file.

Discrete Voice Recognition/Isolated Word Voice Recognition

This process of voice recognition demands a pause must be present between each word.

DVR is used in programs where essence of word starts, and word end is crucial. A blank sound or no sounds helps the recognition mark start and stop indices. An acute example of

DVR usage is word or phrase conversion.

Continuous Voice Recognition/Connected Words Voice Recognition

CVR lift the limitation of discrete voice recognition, and do not require a pause between words to recognize speech. CVR can determine the beginning and ending of any word within a phrase without any indication by the user, making it very complex to use and implement.

Spontaneous Speech Voice Recognition

SSPR is an improved version of continuous voice recognition system, it provides the ability to understand human non-word phrases for example ‘umm’ or ‘ahh’. This can be very useful in-house assistant system because system will automatically recognize the non-word

6 phrases and will not process them as an actual word.

Speech Dependent/Independent Voice Recognition

SDVR is designed for specific speaker, the models are trained around person’s speech style and patterns.

SIVR is opposite of SDVR, which allow it to host wide range of audience. However, SIVR is much more complex than SDVR, which require intensive processing power.

Natural Language Voice Recognition

This is an addition to continuous or spontaneous speech recognition because it can understand questions or commands based on delivery of the speaker. This is broadly used in voice recognition system in phone and super computers to achieve accuracy and efficiency. (Chris 2013)

2.1.3 GOOGLE VOICE RECOGNITION

Given there are many open source speech recognition software’s which can be customized for any specification purpose, google voice recognition is still most optimal choice. Unlike other SR software’s google voice recognition can be used as a library within any application. It allows the ability to make API calls to google serves and get results back in real-time. Once a speech is record via application, it is distributed to 6 different google servers where neural networks are used to find the best results. This eliminates the need to perform expensive processing using user device ensuring the up most accuracy and efficiency for each speech pattern. The results are returned in text form in real time,

7 cancelling any delay which might occur during on device processing. Google Speech recognition also support 80 different languages and multiple accents for each language, provide an edge to HCI system with diverse users. (Chris 2013)

2.2 USER INTERFACE (MANUEL SELECTION)

HCI is built on a speech recognition system but a touch-based GUI is always essential to any HCI. Speech recognition is performing admirably most of the time but given the uncertainty of language and accents in the world. There is always a possibility of misinterpretation in the commands. Given a scenario, where commands cannot be recognized verbally, a touch-based system is necessary, which allows the user to select and perform operations.

2.2.1 USER SELECTION OPTIONS

A graphical user interface will include the list of all the buildings and user preferences.

This will allow the user to select any destination by touch. Given Pixel C tablet is also touch-based, this feature can easily be implemented. User will be given the list of the all the destination, in an easy graphical interface, along with brief information about the destination. User will also be able to command start or stop of vehicle for emergency purposes. Destination selection using touch will remove ambiguities which voice recognition might provide during pre-processing the data.

2.2.2 USER NAVIGATION OPTIONS

Once user selects a destination, graphics interface will transition to map interface and fetch

8 the destination data from database. The algorithm run in the background will command the motors to move, accordingly. Along with selection of destination, user will also be provided to control the speed of the cart, for best possible transport. This feature will not be provided in speech recognition program because it can be , if interpreted incorrectly. (David, Brown, Fan 2010) However, user will be given to the flexibility to increase speed, decrease speed or stop the cart by touch. This will also remove any uncertainties from speech recognition program and give user more control over the vehicle.

2.3 GOOGLE MAP

A web application service which allows users to map the world around them. Google Map is one of the biggest mapping service in the industry. It provides 360-degree camera angles, real-time traffic updates and it proficiently show the path from point A to point B.

However, collecting all this information for complete accuracy is impossible, which force google to rely on third party companies to provide vector data. Google maps have many unique features which can be helpful in implementation of HCI.

Street View

Provides detail view of the street with 360-degree camera flexibility. In HCI street view will allow user to check their surrounding once destination is reached. (Alexis 2012)

Location Service

Provide detail information of device current location and will be proven useful in updating

HCI interface. (Alexis 2012) Location service also help layout a path from point A and B

9 given a set of co-ordinates. This will allow the interface to draw polylines on the map to give visual representation of the path to user.

10 CHAPTER 3

PROJECT GOAL

The goal of this project is to design an android application which will provide a human computer interface for a self-driving golf cart:

• Develop interface software system to provide an open HMI display structure,

allowing easy access to current state of the machine.

• Develop interface software system to request the points of interest (POI) way-

points from the user(s).

(a) These way points will be building destination selected by the user at the

beginning of the transit.

• Develop interface software system to use moving mapping function during route

travel indicating the current vehicle position.

(a) Position will be indicated by a small golf-cart logo on the maps, giving user

easy perspective of gold-cart progress.

• Develop user interface software system to provide zoom in zoom out features on

the map, providing flexibility to look around the institute map.

• Design user interface software system to display the current route and reroute

computed by the system.

(a) Interface will allow the user to make selection and begin transit toward

selected destination. Along with route/reroute information, user interface will

provide POI (Point of Interest) information as the passengers’ travel.

• Develop user interface software system to support multiple modalities of user

requests, allowing user to make selection visually or aurally.

11 (a) To satisfy visual modalities, user software system will support multiple

display for user interaction, allowing user to utilize the golf-cart conveniently.

12 CHAPTER 4

METHODOLOGY

4.1 PROVIDED DATA/PREPROCESSING

To lay down an appropriate path for golf cart, path planning algorithms need to run on back-end and provide way points for golf cart to follow. These way points can be provided to robot in different metric but google maps will require co-ordinates to show route on HCI.

An initial delay between painting the path on maps and calculating the path after selection will also be expected. A pre-processing of building co-ordinates will also be required to avoid any delay in getting building information for the user. This will ensure building selection information is always available via speech or touch.

4.2 APPROACH

4.2.1 DATA BINDINGS

Data binding is part of android architecture to pass data between controller and view without explicitly setting data value to each view property. Data binding eliminates need the need for declare each android view with findViewById(R.id.view_name) and manually updating data with declared reference.

MVVM:

Data binding approach is not optimized till it’s used with MVVM (model view view- model) design pattern rather than traditional design patter MVC (model view controller).

MVVM introduce a new constant which always reflects the state of view. This allows user to bind a constant class with view. Upon updates, user update the class attributes with new values and view automatically reflect changes. Hence, it eliminates the need of

13 setting new values to view properties one by one.

In Android, view-models are very helpful because as user sends the application background, android operating system dispose the view to create space for active application. Upon reactivation of background application, operating system must redraw the view and resume application. However, with view-model approach, view-model is cached in memory and upon re-invocation view is rendered using the cached view-model class. This approach optimizes the operating system and memory utilities.

In this project, building data is binded using view-model and Building.java class has appropriate getter and setters which gets invoked automatically by android to reflect the right state of view according to the provided data.

public class Building extends BaseObservable implements Serializable { private String id; private String name; private String number; private String fullName; private String description; private String surroundings; private double latitude; private double longitude;

public Building() {}

public Building(String id, String name, String surroundings, double latitude, double longitude) { this.id = id; this.fullName = name; this.surroundings = surroundings; this.latitude = latitude; this.longitude = longitude; }

14 @Bindable public String getId() { return id; }

public void setId(String id) { this.id = id; notifyPropertyChanged(BR.id); }

@Bindable public String getFullName() { return fullName; }

public void setFullName(String fullName) { this.fullName = fullName; notifyPropertyChanged(BR.fullName); }

Note: Full Code (Appendix A)

4.2.2 PARSE BUILDING DATA XML

As per project requirements, building information will be provided in form of xml. XML contains building name, number, description, surrounding, latitude and longitude. This xml is placed in assets folder and parsed on start of application. This presented the need of XML parser and data feeder which can send all the collected data to the views.

Android provide XMLParserFactory which allows easy parsing of the xml

(Implementation). However, once xml is parsed, it needs to be sort for building info. All the data is stored in ArrayList of Building object. This arraylist is passed to the

RecyclerView which provide a list of buildings to user in a suitable view (Usage).

15 Implementation

public static ArrayList parseXML(InputStream xml) { ArrayList buildings = new ArrayList<>(); XmlPullParserFactory factory; XmlPullParser parser;

try { factory = XmlPullParserFactory.newInstance(); factory.setNamespaceAware(true); parser = factory.newPullParser(); parser.setInput(xml, null); int eventType = parser.getEventType(); Building building = null; String text = null; while (eventType != XmlPullParser.END_DOCUMENT) { String tagName = parser.getName(); switch (eventType) { case XmlPullParser.START_TAG: tagName = parser.getName(); if (tagName.equalsIgnoreCase(BUILDING)) { building = new Building(); } break; case XmlPullParser.TEXT: text = parser.getText(); break; case XmlPullParser.END_TAG: if (tagName.equalsIgnoreCase(BUILDING)) { buildings.add(building); } else if (tagName.equalsIgnoreCase(ID)) { building.setId(text); } else if (tagName.equalsIgnoreCase(NAME)) { building.setFullName(text); building.parseName(); } else if (tagName.equalsIgnoreCase(LATITUDE)) { building.setLatitude(Double.parseDouble(text)); } else if (tagName.equalsIgnoreCase(LONGITUDE)) { building.setLongitude(Double.parseDouble(text)); } else if (tagName.equalsIgnoreCase(DESCRIPTION)) { building.setSurroundings(text); } break; default: break; } eventType = parser.next();

Note: Full Code (Appendix J)

16 Usage

public void readBuildingsData() { AssetManager assetManager = getAssets(); InputStream inputStream = null; try { inputStream = assetManager.open(BUILDING_FILE); } catch (IOException e) { Log.e("Get XML Assets", e.getMessage()); } buildings = OnBoardUtil.parseXML(inputStream); }

/…In another place…/ recycleView.setLayoutManager(gridLayoutManager); buildingAdapter = new BuildingAdapter(buildings, this); recycleView.setAdapter(buildingAdapter);

Note: Full Code (Appendix K)

4.2.3 SPEECH TO TEXT CONVERTOR

Application allow users to provide verbal inputs. User can select building by saying a building number and confirm selection aurally. To handle speech input, a speech-to-text convertor was created to abstract out speech recognition functionalities. This class provide a way to listen to user input via default google dialog or with a custom dialog

(confirmation dialog). This class triggered only accessed by building selection screen

(Usage) and all speech recognition is handled by android default RecognizeListener

(Implementation). However, once speech is delivered a callback interface is required to deliver text result back to calling activity (Callback).

17 Implementation

/** * Listen without Dialog for specified SpeechRecognizer * * @param speechRecognizer */ public void startListening(final SpeechRecognizer speechRecognizer) { if (speechRecognizer != null) { activity.runOnUiThread(new Runnable() { @Override public void run() { speechRecognizer.startListening(getSpeechIntent()); } }); } }

/** * Stop Listening for specified SpeechRecognizer * @param speechRecognizer */ public void stopListening(final SpeechRecognizer speechRecognizer) { if (speechRecognizer != null) { activity.runOnUiThread(new Runnable() { @Override public void run() { speechRecognizer.stopListening(); } }); } }

Note: Full Code (Appendix F)

Usage

@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_search: return true; case R.id.action_mic: //Deliver message then listen for speech input by starting a speech dialog showProgressBar(); textToSpeechConverter.speakMessage("Speak Desired Building Number", SpeechDialogType.DIALOG); default: return super.onOptionsItemSelected(item); } }

Note: Full Code (Appendix K)

18 switch (speechDialogType) { case DIALOG:

speechToTextConverter.speechWithDialog(REQ_CODE_SPEECH_INPUT_W_DIALOG); break; case WITHOUT_DIALOG: speechToTextConverter.startListening(speechRecognizer); break; }

/** * Handle Speech Result with Google Dialog sent by onActivityResult * * @param speechResult */ public void cipherSpeechInput(String speechResult) { for (Building b : buildings) { if (b.getName().toLowerCase().contains(speechResult) || b.getFullName().toLowerCase().contains(speechResult)) { selectedBuilding = b; makeConfirmAlertDialog(this, "Did you say " + b.getName() + "?"); return; } else { showProgressBar(); textToSpeechConverter.speakMessage("I am sorry I didn't get that! Try again!", SpeechDialogType.DIALOG); }

Note: Full Code (Appendix K)

/** * Handle Without Dialog Speech Results for Alert Dialog * * @param results */ public void handleAlertDialogSpeechResults(ArrayList results) { textToSpeechConverter.finish(); if (results != null) { if (results.contains("yes") || results.contains("Yes") || results.contains("YES")) { updateSelectedBuildingInfo(); placeMarkerOnSelection(); alert.dismiss(); } else if (results.contains("no") || results.contains("No") || results.contains("NO")) { if (alert != null) { alert.dismiss(); } } else { showProgressBar(); textToSpeechConverter.speakMessage("I am sorry I didn't get that! Try again!", SpeechDialogType.WITHOUT_DIALOG); } }

Note: Full Code (Appendix K)

19 Callback

/** * Provide Results Callback from Speech To Text or Text to Speech * * @author Hardeep Singh ([email protected]) * December 28,2018 */ public interface ConversionDelegate {

void onSuccess(ArrayList result);

void onCompletion(SpeechDialogType speechDialogType);

void onErrorOccurred(String errorMessage); }

Note: Full Code (Appendix H)

/** * Handle Result for Custom Speech Recognition * Text To Speech Return Result on onCompletion() * Speech To Text Return Result on onSuccess() * * @param results */ @Override public void onSuccess(ArrayList results) { handleAlertDialogSpeechResults(results); }

@Override public void onCompletion(SpeechDialogType speechDialogType) { hideProgressBar(); switch (speechDialogType) { case DIALOG:

speechToTextConverter.speechWithDialog(REQ_CODE_SPEECH_INPUT_W_DIALOG); break; case WITHOUT_DIALOG: speechToTextConverter.startListening(speechRecognizer); break; } }

@Override public void onErrorOccurred(String errorMessage) { Log.e("SpeechRecognition: ", errorMessage); }

Note: Full Code (Appendix K)

20 4.2.4 TEXT TO SPEECH CONVERTOR

Application can also deliver message and ask questions, aurally. User can invoke speech listening dialog by selecting a mic on main screen, before a dialog is shown a message is delivered to user aurally to pronounce the building number. As user pronounce selection, a question is asked verbally to confirm their selection. To handle speech output, a text-to- speech convertor was created to abstract out speech output functionalities. This class provide a way deliver any message to user verbally. This class triggered only accessed by building selection screen (Usage) and all speech recognition is handled by android default RecognizeListener (Implementation). However, once speech is delivered a callback interface is required to provide success callback to calling activity (Callback).

21 Implementation

/** * Text to Speech Helper class * * @author Hardeep Singh ([email protected]) * March 28,2018 */ public class TextToSpeechConverter {

private ConversionDelegate conversionDelegate; private Activity activity; private TextToSpeech textToSpeech; private String utteranceId = this.hashCode() + "";

public TextToSpeechConverter(ConversionDelegate conversionDelegate) { this.conversionDelegate = conversionDelegate; this.activity = (Activity) conversionDelegate; }

/** * Speak Message and Attach Progress Callback * @param message * @param speechDialogType * @return */ public TextToSpeechConverter speakMessage(final String message, final SpeechDialogType speechDialogType) { textToSpeech = new TextToSpeech(activity, new TextToSpeech.OnInitListener() { @Override public void onInit(int status) { if (status != TextToSpeech.ERROR) { textToSpeech.setLanguage(Locale.getDefault()); textToSpeech.setPitch(1.3f); textToSpeech.setSpeechRate(1f); textToSpeech.setLanguage(Locale.UK); textToSpeech.speak(message, TextToSpeech.QUEUE_FLUSH, null, utteranceId); textToSpeech.setOnUtteranceProgressListener(new DeliveryProgressHandler(speechDialogType)); } else {

conversionDelegate.onErrorOccurred(SpeechUtil.FAILED_TO_INITILIZE_TTS_ENGI NE); } } });

return this; }

/** * Finish Speeching the Message and Shutdown */ public void finish() { if (textToSpeech != null) { textToSpeech.stop(); textToSpeech.shutdown(); }

22 Note: Full Code (Appendix G)

Usage

/* .... */ textToSpeechConverter.speakMessage("Speak Desired Building Number", SpeechDialogType.DIALOG);

/* .... */ public void cipherSpeechInput(String speechResult) { for (Building b : buildings) { if (b.getName().toLowerCase().contains(speechResult) || b.getFullName().toLowerCase().contains(speechResult)) { selectedBuilding = b; makeConfirmAlertDialog(this, "Did you say " + b.getName() + "?"); return; } else { showProgressBar(); textToSpeechConverter.speakMessage("I am sorry I didn't get that! Try again!", SpeechDialogType.DIALOG); } } }

Note: Full Code (Appendix K)

Callback

/** * Provide Results Callback from Speech To Text or Text to Speech * * @author Hardeep Singh ([email protected]) * December 28,2018 */ public interface ConversionDelegate {

void onSuccess(ArrayList result);

void onCompletion(SpeechDialogType speechDialogType);

void onErrorOccurred(String errorMessage); }

Note: Full Code (Appendix H)

23 /** * Handle Result for Custom Speech Recognition * Text To Speech Return Result on onCompletion() * Speech To Text Return Result on onSuccess() * * @param results */ @Override public void onSuccess(ArrayList results) { handleAlertDialogSpeechResults(results); }

@Override public void onCompletion(SpeechDialogType speechDialogType) { hideProgressBar(); switch (speechDialogType) { case DIALOG:

speechToTextConverter.speechWithDialog(REQ_CODE_SPEECH_INPUT_W_DIALOG); break; case WITHOUT_DIALOG: speechToTextConverter.startListening(speechRecognizer); break; } }

@Override public void onErrorOccurred(String errorMessage) { Log.e("SpeechRecognition: ", errorMessage); }

Note: Full Code (Appendix K)

4.2.5 GOOGLE LOCATION UPDATES

User location updates are required to update user location as user moves on path from origin to destination. Android devices always notifies Google with their current location.

However, these location updates cannot be accessed from the device without Google API.

Google play services integrated with application provide access to all the location-based

API’s from google. One of these API contains a generic class,

FusedLocationProviderClient. (Implementation) This client observes user device movement and notifies the application using callbacks. To handle these location update task, GoogleLocationEngine class was designed with appropriate callbacks to send data back to requesting screen. (Callback) Once user location is sent to callbacks, user location is updated on map and appropriate marking are drawn accordingly. (Usage)

24 Implementation

/** * Google Location Provider Engine * * @author Hardeep Singh ([email protected]) * March 28,2018 */ public class GoogleLocationEngine {

private FusedLocationProviderClient fusedLocationProviderClient; private Context context;

public GoogleLocationEngine(Context context) { this.context = context; fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(context); }

@SuppressLint("MissingPermission") public void startLocationUpdate(final LocationUpdateListener locationUpdateListener) { LocationRequest request = LocationRequest.create() .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) .setInterval(300) .setFastestInterval(300);

fusedLocationProviderClient.requestLocationUpdates(request, new LocationDelegate(locationUpdateListener), null); }

public void stopLocationUpdates(LocationUpdateListener locationUpdateListener) { fusedLocationProviderClient.removeLocationUpdates(new LocationDelegate(locationUpdateListener)); }

public interface LocationUpdateListener { void onLocationUpdate(Location location); }

public class LocationDelegate extends LocationCallback {

private LocationUpdateListener locationUpdateListener;

public LocationDelegate(LocationUpdateListener locationUpdateListener) { this.locationUpdateListener = locationUpdateListener; }

@Override public void onLocationResult(LocationResult locationResult) { super.onLocationResult(locationResult);

locationUpdateListener.onLocationUpdate(locationResult.getLastLocation()); } } }

25 Note: Full Code (Appendix E)

Usage

/** * Location Updates from FusedLocationProvider * Initially only one location update is captured till user start the transit * * @param location */ @Override public void onLocationUpdate(Location location) { //Store user last location for Marker lastLocation = location;

//Setup Map Extracting User Location (Origin) and Building Location (Destination) if (startLocation == null) { setUpWithInitialLocation(location); }

//If InProgress and not simulating, Track user location and update marker if (inProgress && !simulate) { LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); updateMarker(latLng); destinationReached(latLng); createUpdateTransitPolyLine(latLng);

//Upda D io d Di Note: Full Code (Appendix L)

Callback

/** * Callback to update User Location */ public interface LocationUpdateListener { void onLocationUpdate(Location location); }

Note: Full Code (Appendix E)

4.2.6 GOOGLE MAPS PATH PLANNING

Once user make a building selection, a path needed to be generated from user location to destination. Currently, this path is generated by Google Maps Location API. API sends back a complete set of waypoints from origin to destination in form of Polyline. Polyline

26 is line from origin to destination with all the turns and waypoints embedded into it. To extract waypoints from this polyline an algorithm need to be implemented, which can be used to draw a custom line on the map. (Usage) API call and extraction of waypoints is abstract out in a custom class, GMPath. (Implementation) GMPath is responsible of making the request to API and decoding waypoints from polyline. Once finished a callback, ResponseInterface, is used to send all this data back to requesting screen/activity. (Callback)

Implementation

public void getDirectionJSON(Context context, LatLng origin, LatLng destination, final ResponseInterface callback) { String url = generateURL(origin, destination); Log.i("Maps: ", "Direction URL: " + url); final JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener() { @Override public void onResponse(JSONObject response) { // Pass Data Back to Caller callback.onDataReceived(response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e("GMPATH VolleyException:", "Error making Volley Request: " + error.getMessage()); } }); VolleySingleton.getInstance(context).addToRequestQueue(jsObjRequest); }

Note: Full Code (Appendix B)

27 public ArrayList>> parseDirectionJSON(JSONObject jsonObject) { ArrayList>> routes = new ArrayList<>(); Log.d("Hsing", jsonObject.toString()); JSONArray jRoutes, jLegs, jSteps; try { jRoutes = jsonObject.getJSONArray("routes"); /** Traversing all routes */ for (int i = 0; i < jRoutes.length(); i++) { jLegs = ((JSONObject) jRoutes.get(i)).getJSONArray("legs"); ArrayList path = new ArrayList<>();

/** Traversing all legs */ for (int j = 0; j < jLegs.length(); j++) { jSteps = ((JSONObject) jLegs.get(j)).getJSONArray("steps");

/** Traversing all steps */ for (int k = 0; k < jSteps.length(); k++) { String polyline; polyline = (String) ((JSONObject) ((JSONObject) jSteps.get(k)).get("polyline")).get("points"); ArrayList list = decodePoly(polyline);

/** Traversing all points */ for (int l = 0; l < list.size(); l++) { HashMap hm = new HashMap<>(); hm.put("lat", Double.toString((list.get(l)).latitude)); hm.put("lng", Double.toString((list.get(l)).longitude)); path.add(hm); } } routes.add(path); } } } catch (JSONException e) { Log.e("GMPATH JSONException:", "Failed parse JSON, JSONExection " + e.getMessage()); } catch (Exception e) { Log.e("GMPATH ParseException:", "Failed parse JSON, ParseException " + e.getMessage()); }

Note: Full Code (Appendix B)

28 /** * Create PolyLine Options from JsonObject of ArrayList * * @param result * @return */ public PolylineOptions generatePathPolyLine(ArrayList>> result) { ArrayList points; PolylineOptions lineOptions = null;

// Traversing through all the routes for (int i = 0; i < result.size(); i++) { points = new ArrayList<>(); lineOptions = new PolylineOptions();

// Fetching i-th route List> path = result.get(i);

// Fetching all the points in i-th route and add to polyline for (int j = 0; j < path.size(); j++) { HashMap point = path.get(j); double lat = Double.parseDouble(point.get("lat")); double lng = Double.parseDouble(point.get("lng")); LatLng position = new LatLng(lat, lng); points.add(position); } lineOptions.addAll(points); lineOptions.width(20); lineOptions.color(Color.BLUE);

//Store way points wayPoints.addAll(points); }

// Drawing polyline if (lineOptions != null) { return lineOptions; } else { Log.d("Maps:", "PolyLine MarkerOptions are empty!"); } return null; }

Note: Full Code (Appendix B)

29 Usage

/** * Get Path From Google API * @param origin * @param destination */ public void generateDirectionsGM(LatLng origin, LatLng destination) { final GMPath gmPath = new GMPath(); gmPath.getDirectionJSON(this, origin, destination, new ResponseInterface() { @Override public void onDataReceived(JSONObject jsonObject) { PolylineOptions polylineOptions = gmPath.generatePathPolyLine(gmPath.parseDirectionJSON(jsonObject)); createPathPolyOptions(gmPath.getWayPoints(), polylineOptions); } }); }

Note: Full Code (Appendix L)

Callback

/** * Response Callbacks for GM Path Data and Serve Data * * @author hardeepsingh on March 30,2018 */ public interface ResponseInterface { void onDataReceived(JSONObject jsonObject); }

Note: Full Code (Appendix D)

4.2.7 SERVER PATH PLANNING

Once user make a building selection, a path needed to be generated from user location to destination. Currently, this path is generated by Google Maps Location API. However, as future feature this path will be generated by hosted server and deliver to application in a text file. Server will send back a complete set of waypoints from origin to destination in form of file. File is line from origin to destination with all the turns and waypoints embedded into it. To extract waypoints from this file an algorithm need to be implemented, which can be used to draw a custom line on the map. (Usage) Server call

30 and extraction of waypoints is abstract out in a custom class, SRPath. (Implementation)

SRPath is responsible of making the request to server and extracting waypoints from file.

Once finished a callback, ResponseInterface, is used to send all this data back to requesting screen/activity. (Callback)

Implementation

public void getDirectionJSON(Context context, LatLng origin, LatLng destination, final ResponseInterface callback) { //TODO: Add Params as required String url = BASE_URL; final JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener() { @Override public void onResponse(JSONObject response) { callback.onDataReceived(response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e("SRPATH VolleyException:", "Error making Volley Request: " + error.getMessage()); } });

VolleySingleton.getInstance(context).addToRequestQueue(jsonObjectRequest); }

Note: Full Code (Appendix C)

/** * File name and Context is passed into this method because there is no server yet * TODO: Once server is up and running, only passs jsonObject and parse is accordingly for way-points and polyline * @param jsonObject @param filename @param context */ public PolylineOptions generatePathPolyLine(Context context, JSONObject jsonObject, String fileName) { PolylineOptions polylineOptions = new PolylineOptions(); wayPoints.clear(); wayPoints.addAll(OnBoardUtil.readCordinatesFromFile(context, fileName));

polylineOptions.addAll(wayPoints); polylineOptions.width(20); polylineOptions.color(Color.BLUE); return polylineOptions; }

31 Note: Full Code (Appendix B)

Usage

/** * Get Path from Server * @param origin * @param destination */ public void generateDirectionSR(LatLng origin, LatLng destination) { final SRPath srPath = new SRPath(); srPath.getDirectionJSON(this, origin, destination, new ResponseInterface() { @Override public void onDataReceived(JSONObject jsonObject) { PolylineOptions polylineOptions = srPath.generatePathPolyLine(getBaseContext(), jsonObject, wayPointFileName); createPathPolyOptions(srPath.getWayPoints(), polylineOptions); } }); }

Note: Full Code (Appendix L)

Callback

/** * Response Callbacks for GM Path Data and Serve Data * * @author hardeepsingh on March 30,2018 */ public interface ResponseInterface { void onDataReceived(JSONObject jsonObject); }

Note: Full Code (Appendix D)

4.2.8 SIMULATOR

Simulator is used to mock the movement of user location on path for demo purposes.

Simulator use waypoints arraylist to move the user marker along the path defined.

32 /** * Simulate the marker on route for demo purposes (Requires Simulate Flag) * Animation Delay is used to cause a delay between current way-point to next way-point */ private void simulateMarker() { handler = new Handler(); final long animationDelay = 1250; runnable = new Runnable() { int i = 0;

@Override public void run() { if (i < wayPoints.size()) { LatLng current = wayPoints.get(i); updateMarker(current); createUpdateTransitPolyLine(current); lastLocation = OnBoardUtil.convertLatLngToLocation(current); updateProgressBindings(); destinationReached(current);

handler.postDelayed(this, animationDelay); } i++; } }; handler.post(runnable); }

/** * Check if destination is reached by checking if current and destination distance is less than 5 meter away * @param current */ public void destinationReached(LatLng current) { if (wayPoints.size() > 0) { LatLng destination = wayPoints.get(wayPoints.size() - 1); if (SphericalUtil.computeDistanceBetween(current, destination) < 5) { AnimationUtil.showDestinationPanel(binding); binding.bName.setText(building.getFullName()); binding.bDescription.setText(building.getSurroundings()); } } }

Note: Full Code (Appendix L)

33 CHAPTER 5

DATA FLOWS

5.1 GOOGLE MAP PATH WITH ACTIVE LOCATION UPDATES

Figure 2. Data flow with Google Maps path and active location updates

34 5.2 GOOGLE MAP PATH WITH SIMULATED LOCATION UPDATES

Figure 3. Data flow with Google Maps path and simulated location updates

35 5.3 FILE PROVIDED PATH WITH ACTIVE LOCATION UPDATES

Figure 4. Data flow with way-point file path and active location updates

36 5.4 FILE PROVIDED PATH WITH SIMULATED LOCATION UPDATES

Figure 5. Data flow with way-point file path and simulated location updates

37 CHAPTER 6

RESULTS

There will be two major evaluations of quality. First, accuracy of speech recognition model to interrupt verbal commands. Given google voice recognition is based on neural network, evaluation can be based round mean square error to find the accuracy of speech model.

However, this is only possible on server and access is permitted to server. Ultimately to evaluate google voice recognition, evaluation must be based on google yearly statics documentation. On other hand, evaluation of accurate path plotting, and path generation can be evaluated by selecting a destination and following google map poly line for accuracy. Poly line will display the full path the vehicle will have to cover to get to destination. If correct path is calculated, the polylines will follow all guidelines and all within bounds.

6.1 SELECTION/MAIN SCREEN

Application starts with selection screen that provides multiple type inputs and selection options

38

Figure 6. Main screen of application

6.1.1 OPTIONS

On main screen, user must select a building before a transit can start. There are multiple ways to select a building, verbally or by touch. There are multiple options like search for building, verbally pronounce the building number to make selection or scroll through the building list to select.

Search

Search icon or magnifying glass is located on top right-hand corner of the screen. Once clicked, “Welcome to Cal Poly Pomona Transit” will be replaced with text input field and

39 keyboard will be shown. As user type the building number, building list will be updated to show only similar or exact building numbers. Once done user can tap arrow icon located on left corner of screen to go back to initial setup.

Figure 7. Search Bar usage

40 Speech

User can invoke speech listening dialog by pressing the mic on top right-hand corner.

Computer will verbally ask you to speak a building number and show a prompt waiting for your input

Figure 8. Default Google speech recognition dialog

Once user speak the building number, a voice recognition will generate a confirmation dialog with interpreted building number. If building number was not understood or does not exist in list then a vocal message will be delivered, “I am sorry, I didn’t catch that please try again!” and dialog will be shown again for next input.

41

Figure 9. A confirmation dialog to confirm user selection by speech or touch

Once confirmation dialog is shown a verbal message will be delivered again to confirm your entry. Voice recognition will wait for your response, to confirm the dialog with

“yes” or “no”. If input is not understood then a vocal message will be delivered, “I am sorry, I didn’t catch that please try again!” and dialog will be shown again for next input.

If yes, initial screen will be updated to portray the selection info in the bottom panel and map will mark the selected building location with marker

Figure 10. Map view when building is selected

42

Figure 11. Bottom panel when building is selected

If no, initial screen will not update, and original state will be shown

Figure 12. Map view when building is not selected

Figure 13. Bottom panel when building is not selected

Selection By Touch

If user choose to not use the verbal communication option. They will have the flexibility to choose from scrollable list

43

Figure 14. Building information list view

Upon selection, a confirmation dialog with interpreted building number with confirmation options.

Figure 15. A confirmation dialog to confirm user selection by speech or touch

44

Once confirmation dialog shown, user will select “yes” or “no” from confirmation dialog.

If yes, initial screen will be updated to portray the selection info in the bottom panel and map will mark the selected building location with marker

Figure 16. Map view when building is selected

Figure 17. Bottom panel when building is selected

If no, initial screen will not update, and original state will be shown

45

Figure 18. Map view when building is not selected

Figure 19. Bottom panel when building is not selected

Start Over

Start over button is to clear any selection and move back to original setup

Figure 20. Bottom panel building selected (before start over action)

46

Figure 21. Bottom panel with start over action

Route

Once building is selected, user can use the route button to choose type of transit. There are four types of transit in this application. Each transit opens a new activity with specified features. If building selection is not made and user try to select route button a message will be shown, stating “Please selection a building”. Next screen cannot be launched without a destination address (building info).

There are 4 type of transit options in this application. To allow user a choice, a dialog will be shown with all transit options. Upon selection user will be redirect to a new screen with features reflecting user selection

Figure 22. Different transit options

47 6.2 NAVIGATION SCREEN

Navigation screen handles path generation, user location updates and user transit information. As user moves on the path user location is updates to provide user a perspective of progress toward the route. User will also be provided with distance and time remaining till distance. Once distance is reached a destination panel will be launched to allow user to select new destinations.

6.2.1 TRANSIT

Launch Panel

Launch Panel shows information about user destination. It shows building number, name, description and surroundings, along with duration and time to destination. Launch panel also places two buttons on bottom of right of the screen. One button starts the transit

“Lets go”, and other button take user back to selection screen for new selection “Restart”.

Start button also zoom on to user location to provide closer view of movement as user move on the path.

Figure 23. Launch panel

48

Figure 24. Launch screen action buttons

In-Route Panel

In-route panel shows information take away all the building related information and only shows remaining duration and distance to the destination. In route panel also replace launch panel buttons with “Stop” button. This stop the transit, bring back the launch panel and zoom out of the user location to show full path on the map.

Figure 25. In-route panel

Figure 26. In-route action button

Destination Panel

Once destination is reached a destination panel is shown replacing in-route panel.

Destination panel takes away all the side panels and show a panel on bottom screen with destination surrounding and a restart button to select a new destination.

49

Figure 27. Destination arrived panel with action button

50 Google map path generation with active location updates

Transit with google path generation use Google location API to generate the path from user current location to user selected destination. Once path is generated, map will automatically zoom-in on the path, highlight the path with blue line and present a launch panel to user for desired actions. In this transit, once user start the transit, location will be updated as user move, and green line will be drawn on the map to represent user movement.

Figure 28. Google map path and active location updates, launch screen

Figure 29. Google map path and active location updates, in-route screen

51 Google map path generation with simulated location updates

Transit with google path generation use Google location API to generate the path from user current location to user selected destination. Once path is generated, map will automatically zoom-in on the path, highlight the path with blue line and present a launch panel to user for desired actions. In this transit, once user start the transit, location will be updated by simulator (mock user movement), and green line will be drawn on the map to represent user movement.

Figure 30. Google map path and simulated location updates, launch screen

Figure 31. Google map path and simulated location updates, in-route screen

52 Way-point file Path Generation with active location updates

Transit with way-point file path generation will use provided waypoints file to generate a path to destination. Once path is generated, map will automatically zoom-in on the path, highlight the path with blue line and present a launch panel to user for desired actions. In this transit, once user start the transit, location will be updated as user move, and green line will be drawn on the map to represent user movement.

Figure 32. Way-point file path and active location updates, launch screen

Figure 33. Way-point file path and active location updates, in-route screen

Note: Distance and duration information might not be correct because screenshots were taken away from university. Hence estimates reflect my actual location calculations

53 Way-point file path generation with simulated location updates

Transit with way-point file path generation will use provided waypoints file to generate a path to destination. Once path is generated, map will automatically zoom-in on the path, highlight the path with blue line and present a launch panel to user for desired actions. In this transit, once user start the transit, location will be updated by simulator (mock user movement), and green line will be drawn on the map to represent user movement.

Figure 34. Way-point file path and simulated location updates, launch screen

Figure 35. Way-point file path and simulated location updates, in-route screen

54

Figure 36. Destination reached panel Project satisfied all project goals by integrating everything in a neat and animates user interface. Application can follow user on path and simulate the effect of user moving on a path, allowing it to be a complete product for production or future developments.

55 CHAPTER 7

EVALUATION OF RESULTS

To evaluate results, error between given path and user movement on that path, is calculated. However, path consists of less waypoints compare to user movement. User movement is logged every 700 milliseconds while moving along path. However, path waypoints density increases or decrease according to turns and straight away. This raise an issue for RMSE (Root Mean Square Error) calculation because there is no 1 to 1 ratio between two datasets.

Equation 2. Root Mean Square Error equation

7.1 APPROACH

To create 1:1 ratio between two datasets, an algorithm was developed which maps closest path point to user location.

//Find closest Location GEO points from Path file and store it val geoPointInfo = mutableListOf() locationList.forEach({ val location = it var shortestDistance = Double.MAX_VALUE var shortDistancePoint: GeoPoint? = null pathList.forEach({ val distance = getDistanceInMeters(location, it) if (shortestDistance > distance) { shortestDistance = distance shortDistancePoint = it } }) geoPointInfo.add(GeoPointInfo(shortDistancePoint!!, location, "%.5f".format(shortestDistance).toDouble(), null)) })

Note: Full Code (Appendix M)

56 This create a new set of data with same path waypoint pointing to multiple user location

(GeoPointInfo). To overcome any unnecessary data, an average of all the location waypoints were calculated associated with single path waypoint (DistinctGeoPointInfo).

var distinctGeoPointInfo = mutableListOf() pathList.forEach({ val pathPoint = it var averageLat = 0.0 var averageLng = 0.0 var dataPoint: GeoPointInfo? = null var counter = 0 geoPointInfo.forEach({ dataPoint = it if (pathPoint == it.pathGeoPoint) { averageLat += it.locationGeoPoint.latitude averageLng += it.locationGeoPoint.longitude counter++ } }) if (averageLat != 0.0 && averageLng != 0.0) { val averageLocationGeoPoint = GeoPoint(averageLat / counter, averageLng / counter) val newGeoInfoPointInfo = GeoPointInfo(pathPoint, averageLocationGeoPoint, dataPoint!!.distance, GeoPoint(it.latitude - averageLocationGeoPoint.latitude, it.longitude - averageLocationGeoPoint.longitude)) distinctGeoPointInfo.add(newGeoInfoPointInfo) } })

Note: Full Code (Appendix M)

As a result, 1:1 data set was created for path and user location waypoints. An equation of

RMSE is applied to latitude and longitude to get an error for each property.

fun rootMeanSquareError(data: List): List { var totalLat = 0.0 var totalLng = 0.0 var totalDistance = 0.0 var n = data.size data.forEach({ totalLat += Math.pow(it.residual!!.latitude, 2.0) totalLng += Math.pow(it.residual!!.latitude, 2.0) totalDistance += Math.pow(it.distance, 2.0) })

return listOf(Math.sqrt(totalLat / n), Math.sqrt(totalLng / n), Math.sqrt(totalDistance / n)) }

Note: Full Code (Appendix M)

57 7.2 RESULTS

Compute o Building 17:

Root Mean Square Error Latitude: 4.575669127001064E-5 Root Mean Square Error Longitude: 4.575669127001064E-5 Root Mean Square Error Distance: 5.357289999999999

Note: Detailed Data Set (Appendix N)

Compute to Building 66:

Root Mean Square Error Latitude: 6.720915119232342E-5 Root Mean Square Error Longitude: 6.720915119232342E-5 Root Mean Square Error Distance: 7.113816000000002

Note: Detailed Data Set (Appendix O)

Compute to Building 77:

Root Mean Square Error Latitude: 5.979131832767509E-5 Root Mean Square Error Longitude: 5.979131832767509E-5 Root Mean Square Error Distance: 6.1056239999999974

Note: Detailed Data (Appendix P)

Compute to Building 112:

Root Mean Square Error Latitude: 4.280093507626858E-5 Root Mean Square Error Longitude: 4.280093507626858E-5 Root Mean Square Error Distance: 4.1991999999999985

Note: Detailed Data Set (Appendix Q)

58 CHAPTER 8

FUTURE WORKS

8.1 ENHANCED SPEECH RECOGNITION

Given android application is speech driven, speech recognition model has to be trained for specific building number. For example, “Building 1” get deciphered as “Building 1” but “Building 12b” get deciphered as “Building Twelve B”. This make it very difficult to understand user command against the actual building data source. To improve on this functionality, a custom speech recognition engine need to be implemented with custom speech model to decipher user input correct

59 REFERENCES

Adams, Chris. "Explaining the Different Types of Voice Recognition." ThoughtCo.

N.p., 30 June 2013. Web. 06 July 2017.

Churchill, Elizabeth, Anne Bowser, and Jennifer Preece. "Interactions." Teaching and

Learning Human-computer Interaction. IX Interactions, Mar.-Apr. 2013. Web.

06 July 2017.

Google "Google Maps Type and Usages." Google. Google, 7 June 2017. Web. 07 July

2017.

Kalyanpur, Aditya, and J. William Murdock. "Unsupervised Entity-Relation Analysis in

IBM Watson." Proceedings of the Third Annual Conference on Advances in

Cognitive Systems. Cognitive System, 2015. Web. 23 Feb. 2017.

Kunal Shrivastava, Nishant Singhal, Pradip K. Das, and Shivashankar B. Nair. 2013. A

Speech Recognition Client-Server Model for Control of Multiple Robots. In

Proceedings of Conference on Advances In Robotics (AIR '13). ACM, New York,

NY, USA, , Article 69 , 6 pages

Madrigal, Alexis C. "How Google Builds Its Maps—and What It Means for the Future of

Everything." The Atlantic. Atlantic Media Company, 06 Sept. 2012. Web. 07 July

2017.

Stanley, Morgan. "Autonomous Cars Self-Driving the New Auto Industry Paradigm."

(n.d.): n. pag. Princeton. Princeton Education, 6 Nov. 2013. Web. 23 Feb. 2017.

Stephanidis, Constantine. "1." Universal Access in Human-Computer Interaction.

Mahwah, NJ: Lawrence Erlbaum Associates, 2001. 3+. Print.

Young, Richard M., and Phil Barnard. "The Use of Scenarios in Human-Computer

60 Interaction Research: Turbocharging the Tortoise of Cumulative Science." MRC

Applied Psychology Unit, Mar.-Apr. 1987. Web. 14 Mar. 2017.

61 APPENDIX

A. BuildingInfo

https://github.com/hardeepsingh07/OnBoardComputer/blob/master/app/src/main/java

/com/example/hardeepsingh/onboardcomputer/models/Building.java

B. GMPath

https://github.com/hardeepsingh07/OnBoardComputer/blob/master/app/src/main/java

/com/example/hardeepsingh/onboardcomputer/pathHandlers/GMPath.java

C. SRPath

https://github.com/hardeepsingh07/OnBoardComputer/blob/master/app/src/main/java

/com/example/hardeepsingh/onboardcomputer/pathHandlers/SRPath.java

D. ResponseInterface

https://github.com/hardeepsingh07/OnBoardComputer/blob/master/app/src/main/java

/com/example/hardeepsingh/onboardcomputer/pathHandlers/ResponseInterface.java

E. GoogleLocationEngine

https://github.com/hardeepsingh07/OnBoardComputer/blob/master/app/src/main/java

/com/example/hardeepsingh/onboardcomputer/pathHandlers/GoogleLocationEngine.j

ava

F. SpeechToTextConvertor

https://github.com/hardeepsingh07/OnBoardComputer/blob/master/app/src/main/java

/com/example/hardeepsingh/onboardcomputer/speech/SpeechToTextConverter.java

G. TextToSpeechConvertor

https://github.com/hardeepsingh07/OnBoardComputer/blob/master/app/src/main/java

/com/example/hardeepsingh/onboardcomputer/speech/TextToSpeechConverter.java

62 H. ConversionDelegate

https://github.com/hardeepsingh07/OnBoardComputer/blob/master/app/src/main/java

/com/example/hardeepsingh/onboardcomputer/speech/ConversionDelegate.java

I. AnimationUtil

https://github.com/hardeepsingh07/OnBoardComputer/blob/master/app/src/main/java

/com/example/hardeepsingh/onboardcomputer/utils/AnimationUtil.java

J. OnBoardUtil

https://github.com/hardeepsingh07/OnBoardComputer/blob/master/app/src/main/java

/com/example/hardeepsingh/onboardcomputer/utils/OnBoardUtil.java

K. MainActivity

https://github.com/hardeepsingh07/OnBoardComputer/blob/master/app/src/main/java

/com/example/hardeepsingh/onboardcomputer/activities/MainActivity.java

L. WayppointRoute

https://github.com/hardeepsingh07/OnBoardComputer/blob/master/app/src/main/java

/com/example/hardeepsingh/onboardcomputer/activities/WaypointRoute.java

M. RMSE Calculation Full Program

https://github.com/hardeepsingh07/GeoPointCalculation.git

N. Building 17 Data Set

Path Point: GeoPoint(latitude=34.0555, longitude=-117.82539) | Location Point : GeoPoint(latitude=34.05547610000001, longitude=-117.8254086857143) | Distance = 5.35729 | Residual: GeoPoint(latitude=2.3899999995080634E-5, longitude=1.8685714294974787E-5) Path Point: GeoPoint(latitude=34.05546, longitude=-117.82533) | Location Point : GeoPoint(latitude=34.05539895, longitude=-117.8253299) | Distance = 5.35729 | Residual: GeoPoint(latitude=6.10499999993408E-5, longitude=-9.999999406318238E- 8) Path Point: GeoPoint(latitude=34.05532, longitude=-117.82524) | Location Point : GeoPoint(latitude=34.0553101, longitude=-117.82526475) | Distance = 5.35729 |

63 Residual: GeoPoint(latitude=9.900000002005527E-6, longitude=2.475000000856653E- 5) Path Point: GeoPoint(latitude=34.05518, longitude=-117.82518) | Location Point : GeoPoint(latitude=34.0552168, longitude=-117.8252265) | Distance = 5.35729 | Residual: GeoPoint(latitude=-3.6799999996617316E-5, longitude=4.6499999996285624E-5) Path Point: GeoPoint(latitude=34.05515, longitude=-117.82517) | Location Point : GeoPoint(latitude=34.0551494, longitude=-117.8252167) | Distance = 5.35729 | Residual: GeoPoint(latitude=5.999999999062311E-7, longitude=4.669999999862284E- 5) Path Point: GeoPoint(latitude=34.05515, longitude=-117.82517) | Location Point : GeoPoint(latitude=34.0551494, longitude=-117.8252167) | Distance = 5.35729 | Residual: GeoPoint(latitude=5.999999999062311E-7, longitude=4.669999999862284E- 5) Path Point: GeoPoint(latitude=34.05511, longitude=-117.82518) | Location Point : GeoPoint(latitude=34.0551147, longitude=-117.8252236) | Distance = 5.35729 | Residual: GeoPoint(latitude=-4.699999998081239E-6, longitude=4.359999999792308E- 5) Path Point: GeoPoint(latitude=34.05508, longitude=-117.8252) | Location Point : GeoPoint(latitude=34.0551018, longitude=-117.8252499) | Distance = 5.35729 | Residual: GeoPoint(latitude=-2.1800000006066966E-5, longitude=4.9900000007596645E-5) Path Point: GeoPoint(latitude=34.05504, longitude=-117.82523) | Location Point : GeoPoint(latitude=34.0550806, longitude=-117.8252735) | Distance = 5.35729 | Residual: GeoPoint(latitude=-4.059999999839192E-5, longitude=4.349999998964904E- 5) Path Point: GeoPoint(latitude=34.05502, longitude=-117.82527) | Location Point : GeoPoint(latitude=34.0550584, longitude=-117.8252964) | Distance = 5.35729 | Residual: GeoPoint(latitude=-3.840000000110422E-5, longitude=2.6399999995874168E-5) Path Point: GeoPoint(latitude=34.055, longitude=-117.82531) | Location Point : GeoPoint(latitude=34.0550374, longitude=-117.82532966666668) | Distance = 5.35729 | Residual: GeoPoint(latitude=-3.7400000003628975E-5, longitude=1.9666666673856525E-5) Path Point: GeoPoint(latitude=34.05499, longitude=-117.82536) | Location Point : GeoPoint(latitude=34.0550364, longitude=-117.8253573) | Distance = 5.35729 | Residual: GeoPoint(latitude=-4.640000000222244E-5, longitude=- 2.700000010236181E-6) Path Point: GeoPoint(latitude=34.05508, longitude=-117.82539) | Location Point : GeoPoint(latitude=34.0550613, longitude=-117.82538193333333) | Distance = 5.35729 | Residual: GeoPoint(latitude=1.8699999998261774E-5, longitude=- 8.066666666195488E-6) Path Point: GeoPoint(latitude=34.05513, longitude=-117.82541) | Location Point : GeoPoint(latitude=34.0551609, longitude=-117.8254136) | Distance = 5.35729 | Residual: GeoPoint(latitude=-3.0899999998723615E-5, longitude=3.5999999994373866E-6)

64 Path Point: GeoPoint(latitude=34.05519, longitude=-117.82544) | Location Point : GeoPoint(latitude=34.0552037, longitude=-117.825427) | Distance = 5.35729 | Residual: GeoPoint(latitude=-1.3699999996674705E-5, longitude=-1.2999999995599865E-5) Path Point: GeoPoint(latitude=34.05527, longitude=-117.82548) | Location Point : GeoPoint(latitude=34.0552675, longitude=-117.825454) | Distance = 5.35729 | Residual: GeoPoint(latitude=2.500000000793534E-6, longitude=-2.6000000005410584E-5) Path Point: GeoPoint(latitude=34.05532, longitude=-117.82552) | Location Point : GeoPoint(latitude=34.05534515, longitude=-117.8255006) | Distance = 5.35729 | Residual: GeoPoint(latitude=-2.5149999999030115E-5, longitude=- 1.9399999999336615E-5) Path Point: GeoPoint(latitude=34.05539, longitude=-117.82558) | Location Point : GeoPoint(latitude=34.055434, longitude=-117.8255509) | Distance = 5.35729 | Residual: GeoPoint(latitude=-4.399999999549209E-5, longitude=-2.910000000611035E-5) Path Point: GeoPoint(latitude=34.05544, longitude=-117.82563) | Location Point : GeoPoint(latitude=34.0554689, longitude=-117.8255951) | Distance = 5.35729 | Residual: GeoPoint(latitude=-2.890000000377313E-5, longitude=- 3.490000000283544E-5) Path Point: GeoPoint(latitude=34.05548, longitude=-117.82567) | Location Point : GeoPoint(latitude=34.055508, longitude=-117.8256409) | Distance = 5.35729 | Residual: GeoPoint(latitude=-2.800000000036107E-5, longitude=-2.910000000611035E-5) Path Point: GeoPoint(latitude=34.05551, longitude=-117.82571) | Location Point : GeoPoint(latitude=34.0555376, longitude=-117.8257001) | Distance = 5.35729 | Residual: GeoPoint(latitude=-2.7600000002792058E-5, longitude=-9.8999999949001E- 6) Path Point: GeoPoint(latitude=34.05552, longitude=-117.82576) | Location Point : GeoPoint(latitude=34.055567, longitude=-117.8257551) | Distance = 5.35729 | Residual: GeoPoint(latitude=-4.700000000212867E-5, longitude=-4.900000007523886E-6) Path Point: GeoPoint(latitude=34.05562, longitude=-117.82585) | Location Point : GeoPoint(latitude=34.05561053333333, longitude=-117.82581343333334) | Distance = 5.35729 | Residual: GeoPoint(latitude=9.46666666834517E-6, longitude=- 3.656666666529418E-5) Path Point: GeoPoint(latitude=34.05565, longitude=-117.82585) | Location Point : GeoPoint(latitude=34.05565995, longitude=-117.82583595) | Distance = 5.35729 | Residual: GeoPoint(latitude=-9.949999999037118E-6, longitude=- 1.4050000004317553E-5) Path Point: GeoPoint(latitude=34.0557, longitude=-117.82584) | Location Point : GeoPoint(latitude=34.05571466666666, longitude=-117.82582973333335) | Distance = 5.35729 | Residual: GeoPoint(latitude=-1.4666666658058602E-5, longitude=- 1.0266666649272338E-5) Path Point: GeoPoint(latitude=34.05578, longitude=-117.82581) | Location Point : GeoPoint(latitude=34.055814, longitude=-117.8258492) | Distance = 5.35729 | Residual: GeoPoint(latitude=-3.399999999942338E-5, longitude=3.919999998913681E-5) Path Point: GeoPoint(latitude=34.05578, longitude=-117.82581) | Location Point : GeoPoint(latitude=34.055814, longitude=-117.8258492) | Distance = 5.35729 | Residual: GeoPoint(latitude=-3.399999999942338E-5, longitude=3.919999998913681E-5)

65 Path Point: GeoPoint(latitude=34.05589, longitude=-117.82597) | Location Point : GeoPoint(latitude=34.055884025, longitude=-117.8259425) | Distance = 5.35729 | Residual: GeoPoint(latitude=5.975000000546515E-6, longitude=- 2.7500000001623448E-5) Path Point: GeoPoint(latitude=34.05594, longitude=-117.82612) | Location Point : GeoPoint(latitude=34.0559694, longitude=-117.8260908) | Distance = 5.35729 | Residual: GeoPoint(latitude=-2.940000000251075E-5, longitude=- 2.920000000017353E-5) Path Point: GeoPoint(latitude=34.05597, longitude=-117.82621) | Location Point : GeoPoint(latitude=34.056027040000004, longitude=-117.82627754) | Distance = 5.35729 | Residual: GeoPoint(latitude=-5.7040000001506996E-5, longitude=6.754000000341875E-5) Path Point: GeoPoint(latitude=34.05607, longitude=-117.82662) | Location Point : GeoPoint(latitude=34.05603352, longitude=-117.8265418) | Distance = 5.35729 | Residual: GeoPoint(latitude=3.647999999856211E-5, longitude=-7.820000000435812E- 5) Path Point: GeoPoint(latitude=34.05607, longitude=-117.82662) | Location Point : GeoPoint(latitude=34.05603352, longitude=-117.8265418) | Distance = 5.35729 | Residual: GeoPoint(latitude=3.647999999856211E-5, longitude=-7.820000000435812E- 5) Path Point: GeoPoint(latitude=34.05593, longitude=-117.82668) | Location Point : GeoPoint(latitude=34.055952166666664, longitude=-117.82668853333332) | Distance = 5.35729 | Residual: GeoPoint(latitude=-2.2166666667544632E-5, longitude=8.533333328841763E-6) Path Point: GeoPoint(latitude=34.05583, longitude=-117.82672) | Location Point : GeoPoint(latitude=34.0558756, longitude=-117.8267558) | Distance = 5.35729 | Residual: GeoPoint(latitude=-4.559999999997899E-5, longitude=3.58000000062475E- 5) Path Point: GeoPoint(latitude=34.05577, longitude=-117.82674) | Location Point : GeoPoint(latitude=34.0557995, longitude=-117.8267754) | Distance = 5.35729 | Residual: GeoPoint(latitude=-2.9499999996573933E-5, longitude=3.540000000157306E-5) Path Point: GeoPoint(latitude=34.05571, longitude=-117.82675) | Location Point : GeoPoint(latitude=34.0557289, longitude=-117.8267971) | Distance = 5.35729 | Residual: GeoPoint(latitude=-1.8900000000598993E-5, longitude=4.709999998908643E-5) Path Point: GeoPoint(latitude=34.05564, longitude=-117.82677) | Location Point : GeoPoint(latitude=34.0556371, longitude=-117.8268028) | Distance = 5.35729 | Residual: GeoPoint(latitude=2.8999999983625457E-6, longitude=3.279999999961092E- 5) Path Point: GeoPoint(latitude=34.05558, longitude=-117.82677) | Location Point : GeoPoint(latitude=34.0555683, longitude=-117.826813) | Distance = 5.35729 | Residual: GeoPoint(latitude=1.170000000172422E-5, longitude=4.3000000005122274E-5) Path Point: GeoPoint(latitude=34.0555, longitude=-117.82677) | Location Point : GeoPoint(latitude=34.055483, longitude=-117.8268042) | Distance = 5.35729 | Residual: GeoPoint(latitude=1.699999999971169E-5, longitude=3.42000000017606E-5)

66 Path Point: GeoPoint(latitude=34.05545, longitude=-117.82676) | Location Point : GeoPoint(latitude=34.0554057, longitude=-117.8267793) | Distance = 5.35729 | Residual: GeoPoint(latitude=4.429999999899792E-5, longitude=1.9300000005273432E- 5) Path Point: GeoPoint(latitude=34.05538, longitude=-117.82672) | Location Point : GeoPoint(latitude=34.0553442, longitude=-117.8267509) | Distance = 5.35729 | Residual: GeoPoint(latitude=3.5799999999142074E-5, longitude=3.0899999998723615E-5) Path Point: GeoPoint(latitude=34.0553, longitude=-117.82665) | Location Point : GeoPoint(latitude=34.0552925, longitude=-117.8266996) | Distance = 5.35729 | Residual: GeoPoint(latitude=7.500000002380602E-6, longitude=4.959999999698539E- 5) Path Point: GeoPoint(latitude=34.05523, longitude=-117.82661) | Location Point : GeoPoint(latitude=34.0552385, longitude=-117.8266479) | Distance = 5.35729 | Residual: GeoPoint(latitude=-8.499999999855845E-6, longitude=3.789999999526117E- 5) Path Point: GeoPoint(latitude=34.05518, longitude=-117.82659) | Location Point : GeoPoint(latitude=34.0551741, longitude=-117.8265973) | Distance = 5.35729 | Residual: GeoPoint(latitude=5.899999997893701E-6, longitude=7.30000000714881E-6) Path Point: GeoPoint(latitude=34.0551, longitude=-117.82655) | Location Point : GeoPoint(latitude=34.0551125, longitude=-117.8265618) | Distance = 5.35729 | Residual: GeoPoint(latitude=-1.2499999996862243E-5, longitude=1.1799999995787402E-5) Path Point: GeoPoint(latitude=34.05507, longitude=-117.82655) | Location Point : GeoPoint(latitude=34.0550564, longitude=-117.826538) | Distance = 5.35729 | Residual: GeoPoint(latitude=1.3600000002611523E-5, longitude=-1.1999999998124622E-5) Path Point: GeoPoint(latitude=34.05498, longitude=-117.82656) | Location Point : GeoPoint(latitude=34.0549741, longitude=-117.8265759) | Distance = 5.35729 | Residual: GeoPoint(latitude=5.899999997893701E-6, longitude=1.589999999396241E- 5) Path Point: GeoPoint(latitude=34.05492, longitude=-117.82659) | Location Point : GeoPoint(latitude=34.0549171, longitude=-117.8266012) | Distance = 5.35729 | Residual: GeoPoint(latitude=2.900000005467973E-6, longitude=1.1200000002986599E- 5) Path Point: GeoPoint(latitude=34.05489, longitude=-117.82662) | Location Point : GeoPoint(latitude=34.0548739, longitude=-117.8266259) | Distance = 5.35729 | Residual: GeoPoint(latitude=1.6100000003405057E-5, longitude=5.899999990788274E- 6) Path Point: GeoPoint(latitude=34.05487, longitude=-117.82665) | Location Point : GeoPoint(latitude=34.05487383333334, longitude=-117.82666016666667) | Distance = 5.35729 | Residual: GeoPoint(latitude=-3.833333337865952E-6, longitude=1.016666666942001E-5) Path Point: GeoPoint(latitude=34.05484, longitude=-117.8267) | Location Point : GeoPoint(latitude=34.054892814285715, longitude=-117.82674324285713) | Distance = 5.35729 | Residual: GeoPoint(latitude=-5.2814285716351606E-5, longitude=4.324285713153131E-5)

67 Path Point: GeoPoint(latitude=34.05479, longitude=-117.82681) | Location Point : GeoPoint(latitude=34.0549796, longitude=-117.8268728) | Distance = 5.35729 | Residual: GeoPoint(latitude=-1.8960000000589616E-4, longitude=6.280000000913333E-5) Path Point: GeoPoint(latitude=34.05479, longitude=-117.82681) | Location Point : GeoPoint(latitude=34.0549796, longitude=-117.8268728) | Distance = 5.35729 | Residual: GeoPoint(latitude=-1.8960000000589616E-4, longitude=6.280000000913333E-5) Path Point: GeoPoint(latitude=34.05524, longitude=-117.82701) | Location Point : GeoPoint(latitude=34.05519715, longitude=-117.82699891666665) | Distance = 5.35729 | Residual: GeoPoint(latitude=4.2849999999816646E-5, longitude=- 1.108333334798317E-5) Path Point: GeoPoint(latitude=34.0557, longitude=-117.82721) | Location Point : GeoPoint(latitude=34.055614274999996, longitude=-117.8271811) | Distance = 5.35729 | Residual: GeoPoint(latitude=8.572500000525451E-5, longitude=- 2.8899999989562275E-5) Path Point: GeoPoint(latitude=34.05585, longitude=-117.82728) | Location Point : GeoPoint(latitude=34.05593245714286, longitude=-117.82729844285713) | Distance = 5.35729 | Residual: GeoPoint(latitude=-8.245714285948225E-5, longitude=1.8442857125933187E-5) Path Point: GeoPoint(latitude=34.05613, longitude=-117.82745) | Location Point : GeoPoint(latitude=34.0560706, longitude=-117.82736135) | Distance = 5.35729 | Residual: GeoPoint(latitude=5.940000000492773E-5, longitude=-8.864999999502743E- 5) Path Point: GeoPoint(latitude=34.05622, longitude=-117.82745) | Location Point : GeoPoint(latitude=34.0563427, longitude=-117.82749578571429) | Distance = 5.35729 | Residual: GeoPoint(latitude=-1.2269999999858783E-4, longitude=4.5785714291923796E-5) Path Point: GeoPoint(latitude=34.05679, longitude=-117.82768) | Location Point : GeoPoint(latitude=34.05669002, longitude=-117.8276525) | Distance = 5.35729 | Residual: GeoPoint(latitude=9.998000000166485E-5, longitude=- 2.7500000001623448E-5) Path Point: GeoPoint(latitude=34.05693, longitude=-117.82774) | Location Point : GeoPoint(latitude=34.056934000000005, longitude=-117.82775063333334) | Distance = 5.35729 | Residual: GeoPoint(latitude=-4.0000000041118255E-6, longitude=1.0633333332066286E-5) Path Point: GeoPoint(latitude=34.05704, longitude=-117.82779) | Location Point : GeoPoint(latitude=34.05706066363637, longitude=-117.82778464545454) | Distance = 5.35729 | Residual: GeoPoint(latitude=-2.066363636998858E-5, longitude=- 5.354545450586556E-6) Path Point: GeoPoint(latitude=34.05718, longitude=-117.82785) | Location Point : GeoPoint(latitude=34.0571751, longitude=-117.827831) | Distance = 5.35729 | Residual: GeoPoint(latitude=4.9000000004184585E-6, longitude=-1.8999999994662176E-5) Path Point: GeoPoint(latitude=34.05723, longitude=-117.82787) | Location Point : GeoPoint(latitude=34.05724475, longitude=-117.82784975) | Distance = 5.35729 |

68 Residual: GeoPoint(latitude=-1.4750000005392394E-5, longitude=- 2.0250000005717084E-5) Path Point: GeoPoint(latitude=34.05732, longitude=-117.82789) | Location Point : GeoPoint(latitude=34.0573126, longitude=-117.8278655) | Distance = 5.35729 | Residual: GeoPoint(latitude=7.399999994106565E-6, longitude=- 2.4499999994986865E-5) Path Point: GeoPoint(latitude=34.05735, longitude=-117.82789) | Location Point : GeoPoint(latitude=34.0573584, longitude=-117.8278697) | Distance = 5.35729 | Residual: GeoPoint(latitude=-8.399999998687235E-6, longitude=- 2.0300000002748675E-5) Path Point: GeoPoint(latitude=34.05741, longitude=-117.82787) | Location Point : GeoPoint(latitude=34.0574058, longitude=-117.827865) | Distance = 5.35729 | Residual: GeoPoint(latitude=4.199999999343618E-6, longitude=-5.000000001587068E-6) Path Point: GeoPoint(latitude=34.05747, longitude=-117.82786) | Location Point : GeoPoint(latitude=34.0574978, longitude=-117.82784985) | Distance = 5.35729 | Residual: GeoPoint(latitude=-2.779999999802385E-5, longitude=- 1.014999999426891E-5) Path Point: GeoPoint(latitude=34.05761, longitude=-117.82778) | Location Point : GeoPoint(latitude=34.05759046666666, longitude=-117.8277939) | Distance = 5.35729 | Residual: GeoPoint(latitude=1.953333333659657E-5, longitude=1.3899999999011925E- 5) Path Point: GeoPoint(latitude=34.05768, longitude=-117.82771) | Location Point : GeoPoint(latitude=34.05768875, longitude=-117.8276883) | Distance = 5.35729 | Residual: GeoPoint(latitude=-8.749999999224656E-6, longitude=- 2.1699999990687502E-5) Path Point: GeoPoint(latitude=34.05775, longitude=-117.82762) | Location Point : GeoPoint(latitude=34.0577448, longitude=-117.8276021) | Distance = 5.35729 | Residual: GeoPoint(latitude=5.19999999681886E-6, longitude=-1.790000000312375E- 5) Path Point: GeoPoint(latitude=34.05781, longitude=-117.82749) | Location Point : GeoPoint(latitude=34.057823299999995, longitude=-117.8274964) | Distance = 5.35729 | Residual: GeoPoint(latitude=-1.3299999992000267E-5, longitude=6.40000000373675E-6) Path Point: GeoPoint(latitude=34.05789, longitude=-117.8273) | Location Point : GeoPoint(latitude=34.05791935, longitude=-117.82728625) | Distance = 5.35729 | Residual: GeoPoint(latitude=-2.9349999998373733E-5, longitude=- 1.3749999993706297E-5) Path Point: GeoPoint(latitude=34.05807, longitude=-117.82687) | Location Point : GeoPoint(latitude=34.058068500000005, longitude=-117.82692023999998) | Distance = 5.35729 | Residual: GeoPoint(latitude=1.499999996212864E-6, longitude=5.023999997888495E-5) Path Point: GeoPoint(latitude=34.05819, longitude=-117.82659) | Location Point : GeoPoint(latitude=34.05822126666667, longitude=-117.82656006666667) | Distance = 5.35729 | Residual: GeoPoint(latitude=-3.126666666730671E-5, longitude=- 2.9933333323128863E-5)

69 Path Point: GeoPoint(latitude=34.05838, longitude=-117.82623) | Location Point : GeoPoint(latitude=34.05837794999999, longitude=-117.82612746666666) | Distance = 5.35729 | Residual: GeoPoint(latitude=2.0500000061929313E-6, longitude=- 1.0253333333309911E-4) Path Point: GeoPoint(latitude=34.05865, longitude=-117.82556) | Location Point : GeoPoint(latitude=34.058586016666666, longitude=-117.8256473) | Distance = 5.35729 | Residual: GeoPoint(latitude=6.398333333379469E-5, longitude=8.730000000412019E- 5) Path Point: GeoPoint(latitude=34.05877, longitude=-117.82531) | Location Point : GeoPoint(latitude=34.05878906, longitude=-117.82518234000001) | Distance = 5.35729 | Residual: GeoPoint(latitude=-1.9059999999626598E-5, longitude=- 1.2765999998975985E-4) Path Point: GeoPoint(latitude=34.05905, longitude=-117.82463) | Location Point : GeoPoint(latitude=34.05898997777778, longitude=-117.82478712222223) | Distance = 5.35729 | Residual: GeoPoint(latitude=6.0022222221789434E-5, longitude=1.5712222223385197E-4) Path Point: GeoPoint(latitude=34.05908, longitude=-117.82457) | Location Point : GeoPoint(latitude=34.05917134285714, longitude=-117.82438518571428) | Distance = 5.35729 | Residual: GeoPoint(latitude=-9.134285713940926E-5, longitude=- 1.8481428571703873E-4) Path Point: GeoPoint(latitude=34.05942, longitude=-117.82382) | Location Point : GeoPoint(latitude=34.05933925, longitude=-117.8240023) | Distance = 5.35729 | Residual: GeoPoint(latitude=8.075000000218324E-5, longitude=1.8230000000585278E- 4) Path Point: GeoPoint(latitude=34.05944, longitude=-117.82379) | Location Point : GeoPoint(latitude=34.059435199999996, longitude=-117.82377415) | Distance = 5.35729 | Residual: GeoPoint(latitude=4.800000006355276E-6, longitude=- 1.584999999693082E-5) Path Point: GeoPoint(latitude=34.05947, longitude=-117.82371) | Location Point : GeoPoint(latitude=34.0594744, longitude=-117.8236922) | Distance = 5.35729 | Residual: GeoPoint(latitude=-4.400000001680837E-6, longitude=- 1.7800000009060568E-5) Path Point: GeoPoint(latitude=34.05952, longitude=-117.82362) | Location Point : GeoPoint(latitude=34.059557425, longitude=-117.8235348875) | Distance = 5.35729 | Residual: GeoPoint(latitude=-3.742500000214477E-5, longitude=- 8.511250000253767E-5) Path Point: GeoPoint(latitude=34.05969, longitude=-117.82325) | Location Point : GeoPoint(latitude=34.05964915, longitude=-117.8233433) | Distance = 5.35729 | Residual: GeoPoint(latitude=4.085000000486616E-5, longitude=9.33000000031825E-5) Path Point: GeoPoint(latitude=34.05971, longitude=-117.82317) | Location Point : GeoPoint(latitude=34.0597249, longitude=-117.8231828) | Distance = 5.35729 | Residual: GeoPoint(latitude=-1.4899999996487168E-5, longitude=1.2799999993262645E-5) Path Point: GeoPoint(latitude=34.05973, longitude=-117.82311) | Location Point : GeoPoint(latitude=34.05977383333333, longitude=-117.82303733333333) | Distance =

70 5.35729 | Residual: GeoPoint(latitude=-4.3833333329246216E-5, longitude=- 7.266666666794208E-5) Path Point: GeoPoint(latitude=34.05991, longitude=-117.82272) | Location Point : GeoPoint(latitude=34.059858266666666, longitude=-117.822811) | Distance = 5.35729 | Residual: GeoPoint(latitude=5.173333333630126E-5, longitude=9.099999999762076E- 5) Path Point: GeoPoint(latitude=34.05991, longitude=-117.82271) | Location Point : GeoPoint(latitude=34.0599127, longitude=-117.8226423) | Distance = 5.35729 | Residual: GeoPoint(latitude=-2.6999999960253263E-6, longitude=- 6.770000000244636E-5) Path Point: GeoPoint(latitude=34.05999, longitude=-117.8225) | Location Point : GeoPoint(latitude=34.05996665, longitude=-117.82251965) | Distance = 5.35729 | Residual: GeoPoint(latitude=2.334999999931142E-5, longitude=1.9649999998705425E- 5) Path Point: GeoPoint(latitude=34.06006, longitude=-117.82234) | Location Point : GeoPoint(latitude=34.06003666666667, longitude=-117.82233566666667) | Distance = 5.35729 | Residual: GeoPoint(latitude=2.333333333126575E-5, longitude=- 4.333333322392718E-6) Path Point: GeoPoint(latitude=34.06015, longitude=-117.82217) | Location Point : GeoPoint(latitude=34.0601113, longitude=-117.82221344999999) | Distance = 5.35729 | Residual: GeoPoint(latitude=3.869999999750462E-5, longitude=4.344999999261745E- 5) Path Point: GeoPoint(latitude=34.06017, longitude=-117.82213) | Location Point : GeoPoint(latitude=34.0601576, longitude=-117.8221442) | Distance = 5.35729 | Residual: GeoPoint(latitude=1.2400000002799061E-5, longitude=1.4199999995412327E-5) Path Point: GeoPoint(latitude=34.06019, longitude=-117.8221) | Location Point : GeoPoint(latitude=34.0601974, longitude=-117.8220871) | Distance = 5.35729 | Residual: GeoPoint(latitude=-7.400000001211993E-6, longitude=- 1.2900000001536682E-5) Path Point: GeoPoint(latitude=34.06023, longitude=-117.82205) | Location Point : GeoPoint(latitude=34.0602495, longitude=-117.8220297) | Distance = 5.35729 | Residual: GeoPoint(latitude=-1.9500000000505224E-5, longitude=- 2.0300000002748675E-5) Root Mean Square Error Latitude: 4.575669127001064E-5 Root Mean Square Error Longitude: 4.575669127001064E-5 Root Mean Square Error Distance: 5.357289999999999

O. Building 66 Data Set

Path Point: GeoPoint(latitude=34.06047, longitude=-117.8218) | Location Point : GeoPoint(latitude=34.06048834166667, longitude=-117.82176163333332) | Distance = 7.113816 | Residual: GeoPoint(latitude=-1.834166666725423E-5, longitude=- 3.83666666721183E-5)

71 Path Point: GeoPoint(latitude=34.06059, longitude=-117.82169) | Location Point : GeoPoint(latitude=34.0605494, longitude=-117.8217184) | Distance = 7.113816 | Residual: GeoPoint(latitude=4.059999999839192E-5, longitude=2.8399999990824654E- 5) Path Point: GeoPoint(latitude=34.06068, longitude=-117.82161) | Location Point : GeoPoint(latitude=34.060763025, longitude=-117.821519675) | Distance = 7.113816 | Residual: GeoPoint(latitude=-8.302500000212376E-5, longitude=- 9.032500000216714E-5) Path Point: GeoPoint(latitude=34.06106, longitude=-117.82122) | Location Point : GeoPoint(latitude=34.060973963636364, longitude=-117.82117248181818) | Distance = 7.113816 | Residual: GeoPoint(latitude=8.603636363346823E-5, longitude=- 4.751818181603085E-5) Path Point: GeoPoint(latitude=34.06112, longitude=-117.82116) | Location Point : GeoPoint(latitude=34.06103065, longitude=-117.82109515) | Distance = 7.113816 | Residual: GeoPoint(latitude=8.93500000032077E-5, longitude=-6.48500000011154E-5) Path Point: GeoPoint(latitude=34.06112, longitude=-117.82116) | Location Point : GeoPoint(latitude=34.06103065, longitude=-117.82109515) | Distance = 7.113816 | Residual: GeoPoint(latitude=8.93500000032077E-5, longitude=-6.48500000011154E-5) Path Point: GeoPoint(latitude=34.0607, longitude=-117.82093) | Location Point : GeoPoint(latitude=34.060768614893625, longitude=-117.82096950212774) | Distance = 7.113816 | Residual: GeoPoint(latitude=-6.861489362819384E-5, longitude=3.950212773418116E-5) Path Point: GeoPoint(latitude=34.06069, longitude=-117.82093) | Location Point : GeoPoint(latitude=34.06057976666667, longitude=-117.82090683333331) | Distance = 7.113816 | Residual: GeoPoint(latitude=1.102333333307115E-4, longitude=- 2.3166666693441584E-5) Path Point: GeoPoint(latitude=34.06032, longitude=-117.82076) | Location Point : GeoPoint(latitude=34.06035022857144, longitude=-117.82081332857138) | Distance = 7.113816 | Residual: GeoPoint(latitude=-3.0228571439749885E-5, longitude=5.332857136863822E-5) Path Point: GeoPoint(latitude=34.06009, longitude=-117.82068) | Location Point : GeoPoint(latitude=34.06014212000001, longitude=-117.82073371999995) | Distance = 7.113816 | Residual: GeoPoint(latitude=-5.212000000653916E-5, longitude=5.371999995418264E-5) Path Point: GeoPoint(latitude=34.06003, longitude=-117.8207) | Location Point : GeoPoint(latitude=34.0600581, longitude=-117.8207365) | Distance = 7.113816 | Residual: GeoPoint(latitude=-2.810000000152968E-5, longitude=3.649999999311149E- 5) Path Point: GeoPoint(latitude=34.05994, longitude=-117.82073) | Location Point : GeoPoint(latitude=34.05995145, longitude=-117.82075590000001) | Distance = 7.113816 | Residual: GeoPoint(latitude=-1.145000000235541E-5, longitude=2.59000000113474E-5) Path Point: GeoPoint(latitude=34.05987, longitude=-117.82072) | Location Point : GeoPoint(latitude=34.05987685, longitude=-117.82073090000002) | Distance = 7.113816 | Residual: GeoPoint(latitude=-6.85000000544278E-6, longitude=1.0900000020797052E-5)

72 Path Point: GeoPoint(latitude=34.05982, longitude=-117.8207) | Location Point : GeoPoint(latitude=34.0598244, longitude=-117.8206742) | Distance = 7.113816 | Residual: GeoPoint(latitude=-4.39999999457541E-6, longitude=- 2.5800000003073364E-5) Path Point: GeoPoint(latitude=34.05975, longitude=-117.82065) | Location Point : GeoPoint(latitude=34.05973423333334, longitude=-117.82060136666671) | Distance = 7.113816 | Residual: GeoPoint(latitude=1.5766666663807882E-5, longitude=- 4.863333329296893E-5) Path Point: GeoPoint(latitude=34.05961, longitude=-117.82049) | Location Point : GeoPoint(latitude=34.059627150000004, longitude=-117.82051394999999) | Distance = 7.113816 | Residual: GeoPoint(latitude=-1.715000000501732E-5, longitude=2.3949999985006798E-5) Path Point: GeoPoint(latitude=34.05956, longitude=-117.82045) | Location Point : GeoPoint(latitude=34.0595582, longitude=-117.8204715) | Distance = 7.113816 | Residual: GeoPoint(latitude=1.7999999997186933E-6, longitude=2.1500000002561137E-5) Path Point: GeoPoint(latitude=34.05955, longitude=-117.82044) | Location Point : GeoPoint(latitude=34.059514, longitude=-117.8204547) | Distance = 7.113816 | Residual: GeoPoint(latitude=3.600000000147929E-5, longitude=1.4699999994149948E- 5) Path Point: GeoPoint(latitude=34.05947, longitude=-117.8204) | Location Point : GeoPoint(latitude=34.0594726, longitude=-117.820432) | Distance = 7.113816 | Residual: GeoPoint(latitude=-2.600000001962144E-6, longitude=3.199999999026204E- 5) Path Point: GeoPoint(latitude=34.05944, longitude=-117.82039) | Location Point : GeoPoint(latitude=34.05940485, longitude=-117.82039124999997) | Distance = 7.113816 | Residual: GeoPoint(latitude=3.515000000220425E-5, longitude=1.249999968422344E-6) Path Point: GeoPoint(latitude=34.05929, longitude=-117.82031) | Location Point : GeoPoint(latitude=34.05931443333333, longitude=-117.82032916666667) | Distance = 7.113816 | Residual: GeoPoint(latitude=-2.44333333299096E-5, longitude=1.916666666090805E-5) Path Point: GeoPoint(latitude=34.05923, longitude=-117.82028) | Location Point : GeoPoint(latitude=34.05921615, longitude=-117.8202739) | Distance = 7.113816 | Residual: GeoPoint(latitude=1.3850000001980334E-5, longitude=- 6.099999993125493E-6) Path Point: GeoPoint(latitude=34.05913, longitude=-117.82021) | Location Point : GeoPoint(latitude=34.059130100000004, longitude=-117.82022864999999) | Distance = 7.113816 | Residual: GeoPoint(latitude=-1.0000000116860974E-7, longitude=1.8649999987019328E-5) Path Point: GeoPoint(latitude=34.05904, longitude=-117.82016) | Location Point : GeoPoint(latitude=34.05904494999999, longitude=-117.82020274999999) | Distance = 7.113816 | Residual: GeoPoint(latitude=-4.949999990344622E-6, longitude=4.274999999154261E-5) Path Point: GeoPoint(latitude=34.05897, longitude=-117.82015) | Location Point : GeoPoint(latitude=34.0589656, longitude=-117.8202278) | Distance = 7.113816 |

73 Residual: GeoPoint(latitude=4.400000001680837E-6, longitude=7.779999999968368E- 5) Path Point: GeoPoint(latitude=34.05889, longitude=-117.82017) | Location Point : GeoPoint(latitude=34.0589203, longitude=-117.8202337) | Distance = 7.113816 | Residual: GeoPoint(latitude=-3.0299999998817384E-5, longitude=6.369999999833453E-5) Path Point: GeoPoint(latitude=34.05883, longitude=-117.82021) | Location Point : GeoPoint(latitude=34.0588635, longitude=-117.8202572) | Distance = 7.113816 | Residual: GeoPoint(latitude=-3.350000000068576E-5, longitude=4.7199999997360464E-5) Path Point: GeoPoint(latitude=34.0588, longitude=-117.82023) | Location Point : GeoPoint(latitude=34.0588159, longitude=-117.8202782) | Distance = 7.113816 | Residual: GeoPoint(latitude=-1.5900000001067838E-5, longitude=4.820000000904656E-5) Path Point: GeoPoint(latitude=34.05877, longitude=-117.82025) | Location Point : GeoPoint(latitude=34.0587717, longitude=-117.8203033) | Distance = 7.113816 | Residual: GeoPoint(latitude=-1.6999999985500835E-6, longitude=5.330000000469681E-5) Path Point: GeoPoint(latitude=34.05873, longitude=-117.82026) | Location Point : GeoPoint(latitude=34.0587357, longitude=-117.8203254) | Distance = 7.113816 | Residual: GeoPoint(latitude=-5.700000002661909E-6, longitude=6.539999999688462E- 5) Path Point: GeoPoint(latitude=34.0587, longitude=-117.82026) | Location Point : GeoPoint(latitude=34.0587017, longitude=-117.8203336) | Distance = 7.113816 | Residual: GeoPoint(latitude=-1.6999999985500835E-6, longitude=7.359999999323463E-5) Path Point: GeoPoint(latitude=34.05862, longitude=-117.82026) | Location Point : GeoPoint(latitude=34.05862225, longitude=-117.82032795) | Distance = 7.113816 | Residual: GeoPoint(latitude=-2.2500000014247235E-6, longitude=6.795000000181517E-5) Path Point: GeoPoint(latitude=34.05852, longitude=-117.82026) | Location Point : GeoPoint(latitude=34.058538150000004, longitude=-117.82033372500001) | Distance = 7.113816 | Residual: GeoPoint(latitude=-1.815000000249256E-5, longitude=7.372500000712989E-5) Path Point: GeoPoint(latitude=34.05846, longitude=-117.82028) | Location Point : GeoPoint(latitude=34.0584788, longitude=-117.8203492) | Distance = 7.113816 | Residual: GeoPoint(latitude=-1.880000000653581E-5, longitude=6.919999999865922E- 5) Path Point: GeoPoint(latitude=34.05842, longitude=-117.8203) | Location Point : GeoPoint(latitude=34.0584459, longitude=-117.8203662) | Distance = 7.113816 | Residual: GeoPoint(latitude=-2.5900000004241974E-5, longitude=6.619999999202264E-5) Path Point: GeoPoint(latitude=34.05831, longitude=-117.82034) | Location Point : GeoPoint(latitude=34.0583294, longitude=-117.82040576666667) | Distance = 7.113816 | Residual: GeoPoint(latitude=-1.9399999999336615E-5, longitude=6.576666666546771E-5)

74 Path Point: GeoPoint(latitude=34.05827, longitude=-117.82034) | Location Point : GeoPoint(latitude=34.05828, longitude=-117.820407) | Distance = 7.113816 | Residual: GeoPoint(latitude=-1.0000000003174137E-5, longitude=6.700000000137152E-5) Path Point: GeoPoint(latitude=34.05816, longitude=-117.82034) | Location Point : GeoPoint(latitude=34.058194799999995, longitude=-117.8204043) | Distance = 7.113816 | Residual: GeoPoint(latitude=-3.4799999994561404E-5, longitude=6.430000000534619E-5) Path Point: GeoPoint(latitude=34.05811, longitude=-117.82035) | Location Point : GeoPoint(latitude=34.0581143, longitude=-117.82040860000001) | Distance = 7.113816 | Residual: GeoPoint(latitude=-4.300000000512227E-6, longitude=5.860000000268428E-5) Path Point: GeoPoint(latitude=34.05803, longitude=-117.82036) | Location Point : GeoPoint(latitude=34.05801629999999, longitude=-117.82041840000002) | Distance = 7.113816 | Residual: GeoPoint(latitude=1.370000001088556E-5, longitude=5.840000002876877E-5) Path Point: GeoPoint(latitude=34.05786, longitude=-117.8204) | Location Point : GeoPoint(latitude=34.05790453333333, longitude=-117.82043496666665) | Distance = 7.113816 | Residual: GeoPoint(latitude=-4.4533333330321057E-5, longitude=3.496666664659642E-5) Path Point: GeoPoint(latitude=34.05776, longitude=-117.82044) | Location Point : GeoPoint(latitude=34.057775566666656, longitude=-117.82045656666669) | Distance = 7.113816 | Residual: GeoPoint(latitude=-1.5566666654365235E-5, longitude=1.6566666687367615E-5) Path Point: GeoPoint(latitude=34.05768, longitude=-117.82048) | Location Point : GeoPoint(latitude=34.0577037, longitude=-117.8205031) | Distance = 7.113816 | Residual: GeoPoint(latitude=-2.3699999999848842E-5, longitude=2.3099999992837184E-5) Path Point: GeoPoint(latitude=34.05764, longitude=-117.82051) | Location Point : GeoPoint(latitude=34.0576705, longitude=-117.8205369) | Distance = 7.113816 | Residual: GeoPoint(latitude=-3.0500000001154604E-5, longitude=2.689999999461179E-5) Path Point: GeoPoint(latitude=34.05761, longitude=-117.82053) | Location Point : GeoPoint(latitude=34.057627350000004, longitude=-117.82058255000001) | Distance = 7.113816 | Residual: GeoPoint(latitude=-1.7350000007354538E-5, longitude=5.255000000659038E-5) Path Point: GeoPoint(latitude=34.05756, longitude=-117.82056) | Location Point : GeoPoint(latitude=34.057583, longitude=-117.8206253) | Distance = 7.113816 | Residual: GeoPoint(latitude=-2.2999999998774E-5, longitude=6.530000000282143E-5) Path Point: GeoPoint(latitude=34.05749, longitude=-117.82063) | Location Point : GeoPoint(latitude=34.0575405, longitude=-117.8206747) | Distance = 7.113816 | Residual: GeoPoint(latitude=-5.050000000039745E-5, longitude=4.470000000367236E- 5) Path Point: GeoPoint(latitude=34.05744, longitude=-117.82069) | Location Point : GeoPoint(latitude=34.0575023, longitude=-117.8207353) | Distance = 7.113816 | Residual: GeoPoint(latitude=-6.230000000329028E-5, longitude=4.529999999647316E- 5)

75 Path Point: GeoPoint(latitude=34.05741, longitude=-117.82079) | Location Point : GeoPoint(latitude=34.05747485, longitude=-117.82080485) | Distance = 7.113816 | Residual: GeoPoint(latitude=-6.48500000011154E-5, longitude=1.4849999999455576E- 5) Path Point: GeoPoint(latitude=34.0574, longitude=-117.82086) | Location Point : GeoPoint(latitude=34.057451933333326, longitude=-117.82091296666665) | Distance = 7.113816 | Residual: GeoPoint(latitude=-5.193333332442762E-5, longitude=5.296666665799421E-5) Path Point: GeoPoint(latitude=34.05737, longitude=-117.82104) | Location Point : GeoPoint(latitude=34.05742818888889, longitude=-117.82103683333331) | Distance = 7.113816 | Residual: GeoPoint(latitude=-5.818888889308482E-5, longitude=- 3.1666666870933113E-6) Path Point: GeoPoint(latitude=34.05735, longitude=-117.82112) | Location Point : GeoPoint(latitude=34.05736433333333, longitude=-117.82114843333332) | Distance = 7.113816 | Residual: GeoPoint(latitude=-1.4333333332672282E-5, longitude=2.8433333326916E-5) Path Point: GeoPoint(latitude=34.05735, longitude=-117.82112) | Location Point : GeoPoint(latitude=34.05736433333333, longitude=-117.82114843333332) | Distance = 7.113816 | Residual: GeoPoint(latitude=-1.4333333332672282E-5, longitude=2.8433333326916E-5) Path Point: GeoPoint(latitude=34.05728, longitude=-117.82111) | Location Point : GeoPoint(latitude=34.05727744, longitude=-117.82117208) | Distance = 7.113816 | Residual: GeoPoint(latitude=2.559999998652529E-6, longitude=6.207999999219282E- 5) Path Point: GeoPoint(latitude=34.05723, longitude=-117.8211) | Location Point : GeoPoint(latitude=34.05720618749999, longitude=-117.82114408750002) | Distance = 7.113816 | Residual: GeoPoint(latitude=2.3812500003828063E-5, longitude=4.408750001516637E-5) Path Point: GeoPoint(latitude=34.05712, longitude=-117.82109) | Location Point : GeoPoint(latitude=34.05711925, longitude=-117.82109286250001) | Distance = 7.113816 | Residual: GeoPoint(latitude=7.49999998106432E-7, longitude=2.8625000112469934E-6) Path Point: GeoPoint(latitude=34.05698, longitude=-117.82098) | Location Point : GeoPoint(latitude=34.05696517142857, longitude=-117.82106892857142) | Distance = 7.113816 | Residual: GeoPoint(latitude=1.4828571430314241E-5, longitude=8.892857141518107E-5) Path Point: GeoPoint(latitude=34.0568, longitude=-117.82102) | Location Point : GeoPoint(latitude=34.05685845, longitude=-117.82110287500004) | Distance = 7.113816 | Residual: GeoPoint(latitude=-5.8449999997378654E-5, longitude=8.287500003234527E-5) Path Point: GeoPoint(latitude=34.05677, longitude=-117.82104) | Location Point : GeoPoint(latitude=34.05680955, longitude=-117.82114335) | Distance = 7.113816 | Residual: GeoPoint(latitude=-3.954999999677966E-5, longitude=1.0335000000338823E-4) Path Point: GeoPoint(latitude=34.05672, longitude=-117.82108) | Location Point : GeoPoint(latitude=34.0567866, longitude=-117.8211679) | Distance = 7.113816 |

76 Residual: GeoPoint(latitude=-6.66000000038025E-5, longitude=8.790000001113185E- 5) Path Point: GeoPoint(latitude=34.05669, longitude=-117.82113) | Location Point : GeoPoint(latitude=34.0567699, longitude=-117.821185) | Distance = 7.113816 | Residual: GeoPoint(latitude=-7.989999999580277E-5, longitude=5.5000000003246896E-5) Path Point: GeoPoint(latitude=34.05667, longitude=-117.82118) | Location Point : GeoPoint(latitude=34.05662072999999, longitude=-117.82117466999996) | Distance = 7.113816 | Residual: GeoPoint(latitude=4.92700000052082E-5, longitude=- 5.330000035996818E-6) Path Point: GeoPoint(latitude=34.05667, longitude=-117.82118) | Location Point : GeoPoint(latitude=34.05662072999999, longitude=-117.82117466999996) | Distance = 7.113816 | Residual: GeoPoint(latitude=4.92700000052082E-5, longitude=- 5.330000035996818E-6) Path Point: GeoPoint(latitude=34.05632, longitude=-117.82096) | Location Point : GeoPoint(latitude=34.05642007777777, longitude=-117.82098817777779) | Distance = 7.113816 | Residual: GeoPoint(latitude=-1.0007777777332194E-4, longitude=2.8177777792848246E-5) Path Point: GeoPoint(latitude=34.05632, longitude=-117.82096) | Location Point : GeoPoint(latitude=34.05642007777777, longitude=-117.82098817777779) | Distance = 7.113816 | Residual: GeoPoint(latitude=-1.0007777777332194E-4, longitude=2.8177777792848246E-5) Path Point: GeoPoint(latitude=34.05636, longitude=-117.82077) | Location Point : GeoPoint(latitude=34.05634728571429, longitude=-117.82082231428573) | Distance = 7.113816 | Residual: GeoPoint(latitude=1.2714285709591877E-5, longitude=5.2314285738930266E-5) Path Point: GeoPoint(latitude=34.05636, longitude=-117.82077) | Location Point : GeoPoint(latitude=34.05634728571429, longitude=-117.82082231428573) | Distance = 7.113816 | Residual: GeoPoint(latitude=1.2714285709591877E-5, longitude=5.2314285738930266E-5) Path Point: GeoPoint(latitude=34.05622, longitude=-117.82072) | Location Point : GeoPoint(latitude=34.056081031818174, longitude=-117.82085895909096) | Distance = 7.113816 | Residual: GeoPoint(latitude=1.389681818295685E-4, longitude=1.3895909096106607E-4) Path Point: GeoPoint(latitude=34.05615, longitude=-117.82062) | Location Point : GeoPoint(latitude=34.0559235, longitude=-117.8209256) | Distance = 7.113816 | Residual: GeoPoint(latitude=2.265000000036821E-4, longitude=3.05599999990136E-4) Path Point: GeoPoint(latitude=34.05613, longitude=-117.8206) | Location Point : GeoPoint(latitude=34.0559059, longitude=-117.8209118) | Distance = 7.113816 | Residual: GeoPoint(latitude=2.2410000000405716E-4, longitude=3.1180000000574637E-4) Path Point: GeoPoint(latitude=34.05611, longitude=-117.82058) | Location Point : GeoPoint(latitude=34.0558395, longitude=-117.82085989999993) | Distance = 7.113816 | Residual: GeoPoint(latitude=2.704999999991742E-4, longitude=2.798999999242824E- 4) Root Mean Square Error Latitude: 6.720915119232342E-5

77 Root Mean Square Error Longitude: 6.720915119232342E-5 Root Mean Square Error Distance: 7.113816000000002

P. Building 77 Data Set

Path Point: GeoPoint(latitude=34.06267, longitude=-117.8246) | Location Point : GeoPoint(latitude=34.062743857142856, longitude=-117.8245880857143) | Distance = 6.105624 | Residual: GeoPoint(latitude=-7.385714285845779E-5, longitude=- 1.1914285707348427E-5) Path Point: GeoPoint(latitude=34.06299, longitude=-117.82515) | Location Point : GeoPoint(latitude=34.06293713, longitude=-117.82498331000002) | Distance = 6.105624 | Residual: GeoPoint(latitude=5.286999999754016E-5, longitude=- 1.6668999997193623E-4) Path Point: GeoPoint(latitude=34.06299, longitude=-117.82515) | Location Point : GeoPoint(latitude=34.06293713, longitude=-117.82498331000002) | Distance = 6.105624 | Residual: GeoPoint(latitude=5.286999999754016E-5, longitude=- 1.6668999997193623E-4) Path Point: GeoPoint(latitude=34.06304, longitude=-117.82461) | Location Point : GeoPoint(latitude=34.0630366, longitude=-117.82473331999999) | Distance = 6.105624 | Residual: GeoPoint(latitude=3.4000000042055945E-6, longitude=1.23319999985938E- 4) Path Point: GeoPoint(latitude=34.06303, longitude=-117.82452) | Location Point : GeoPoint(latitude=34.063010649999995, longitude=-117.82450985) | Distance = 6.105624 | Residual: GeoPoint(latitude=1.9350000002305023E-5, longitude=- 1.0150000008479765E-5) Path Point: GeoPoint(latitude=34.06301, longitude=-117.82441) | Location Point : GeoPoint(latitude=34.0629868, longitude=-117.8243981) | Distance = 6.105624 | Residual: GeoPoint(latitude=2.320000000111122E-5, longitude=-1.190000000406144E- 5) Path Point: GeoPoint(latitude=34.06298, longitude=-117.8243) | Location Point : GeoPoint(latitude=34.0629517, longitude=-117.8243278) | Distance = 6.105624 | Residual: GeoPoint(latitude=2.83000000038669E-5, longitude=2.7800000012234705E- 5) Path Point: GeoPoint(latitude=34.06296, longitude=-117.82422) | Location Point : GeoPoint(latitude=34.0629013, longitude=-117.8242602) | Distance = 6.105624 | Residual: GeoPoint(latitude=5.8699999996747465E-5, longitude=4.020000000082291E- 5) Path Point: GeoPoint(latitude=34.0629, longitude=-117.82411) | Location Point : GeoPoint(latitude=34.0628575, longitude=-117.8241997) | Distance = 6.105624 | Residual: GeoPoint(latitude=4.2499999999279225E-5, longitude=8.969999998953426E- 5) Path Point: GeoPoint(latitude=34.06287, longitude=-117.82404) | Location Point : GeoPoint(latitude=34.0628017, longitude=-117.8241229) | Distance = 6.105624 | Residual: GeoPoint(latitude=6.829999999524716E-5, longitude=8.290000000954478E- 5)

78 Path Point: GeoPoint(latitude=34.06279, longitude=-117.82394) | Location Point : GeoPoint(latitude=34.062711433333334, longitude=-117.82395636666666) | Distance = 6.105624 | Residual: GeoPoint(latitude=7.856666666583578E-5, longitude=1.636666667081954E-5) Path Point: GeoPoint(latitude=34.06263, longitude=-117.82371) | Location Point : GeoPoint(latitude=34.06258995, longitude=-117.8237446) | Distance = 6.105624 | Residual: GeoPoint(latitude=4.004999999551728E-5, longitude=3.4599999992224184E- 5) Path Point: GeoPoint(latitude=34.06253, longitude=-117.82357) | Location Point : GeoPoint(latitude=34.0624812, longitude=-117.82359575000001) | Distance = 6.105624 | Residual: GeoPoint(latitude=4.8800000001847366E-5, longitude=2.5750000006041773E-5) Path Point: GeoPoint(latitude=34.06247, longitude=-117.82344) | Location Point : GeoPoint(latitude=34.0624094, longitude=-117.8234531) | Distance = 6.105624 | Residual: GeoPoint(latitude=6.059999999763477E-5, longitude=1.3099999989663047E- 5) Path Point: GeoPoint(latitude=34.06244, longitude=-117.82337) | Location Point : GeoPoint(latitude=34.062378, longitude=-117.8233442) | Distance = 6.105624 | Residual: GeoPoint(latitude=6.199999999978445E-5, longitude=- 2.5800000003073364E-5) Path Point: GeoPoint(latitude=34.06239, longitude=-117.82321) | Location Point : GeoPoint(latitude=34.0623505, longitude=-117.8232378) | Distance = 6.105624 | Residual: GeoPoint(latitude=3.949999999974807E-5, longitude=2.779999999802385E- 5) Path Point: GeoPoint(latitude=34.06237, longitude=-117.82313) | Location Point : GeoPoint(latitude=34.0623224, longitude=-117.8231362) | Distance = 6.105624 | Residual: GeoPoint(latitude=4.7600000002034903E-5, longitude=6.199999987188676E- 6) Path Point: GeoPoint(latitude=34.06235, longitude=-117.82302) | Location Point : GeoPoint(latitude=34.0623032, longitude=-117.8230174) | Distance = 6.105624 | Residual: GeoPoint(latitude=4.679999999979145E-5, longitude=-2.600000001962144E- 6) Path Point: GeoPoint(latitude=34.0623, longitude=-117.82286) | Location Point : GeoPoint(latitude=34.062273, longitude=-117.8229074) | Distance = 6.105624 | Residual: GeoPoint(latitude=2.7000000002885827E-5, longitude=4.7399999999697684E-5) Path Point: GeoPoint(latitude=34.06227, longitude=-117.82277) | Location Point : GeoPoint(latitude=34.0622331, longitude=-117.8227696) | Distance = 6.105624 | Residual: GeoPoint(latitude=3.6899999997785926E-5, longitude=- 4.0000000467443897E-7) Path Point: GeoPoint(latitude=34.06223, longitude=-117.82264) | Location Point : GeoPoint(latitude=34.0621725, longitude=-117.8226474) | Distance = 6.105624 | Residual: GeoPoint(latitude=5.7499999996935E-5, longitude=7.399999987001138E-6) Path Point: GeoPoint(latitude=34.06219, longitude=-117.82256) | Location Point : GeoPoint(latitude=34.0621301, longitude=-117.8225701) | Distance = 6.105624 |

79 Residual: GeoPoint(latitude=5.9900000003665355E-5, longitude=1.0099999997237319E-5) Path Point: GeoPoint(latitude=34.06214, longitude=-117.82246) | Location Point : GeoPoint(latitude=34.0620814, longitude=-117.8225094) | Distance = 6.105624 | Residual: GeoPoint(latitude=5.860000000268428E-5, longitude=4.939999999464817E- 5) Path Point: GeoPoint(latitude=34.06206, longitude=-117.82238) | Location Point : GeoPoint(latitude=34.0620219, longitude=-117.8225015) | Distance = 6.105624 | Residual: GeoPoint(latitude=3.8100000004703816E-5, longitude=1.2150000000588079E-4) Path Point: GeoPoint(latitude=34.06188, longitude=-117.82245) | Location Point : GeoPoint(latitude=34.061955, longitude=-117.8224992) | Distance = 6.105624 | Residual: GeoPoint(latitude=-7.499999999538431E-5, longitude=4.919999999231095E- 5) Path Point: GeoPoint(latitude=34.06187, longitude=-117.82248) | Location Point : GeoPoint(latitude=34.061906, longitude=-117.8225339) | Distance = 6.105624 | Residual: GeoPoint(latitude=-3.600000000147929E-5, longitude=5.3899999997497616E-5) Path Point: GeoPoint(latitude=34.06184, longitude=-117.82263) | Location Point : GeoPoint(latitude=34.061848966666666, longitude=-117.82266816666667) | Distance = 6.105624 | Residual: GeoPoint(latitude=-8.966666669607548E-6, longitude=3.816666666978108E-5) Path Point: GeoPoint(latitude=34.06179, longitude=-117.82287) | Location Point : GeoPoint(latitude=34.06180365, longitude=-117.82287015) | Distance = 6.105624 | Residual: GeoPoint(latitude=-1.3649999999643114E-5, longitude=1.500000053056283E-7) Path Point: GeoPoint(latitude=34.06171, longitude=-117.82305) | Location Point : GeoPoint(latitude=34.06174253333334, longitude=-117.82307193333334) | Distance = 6.105624 | Residual: GeoPoint(latitude=-3.253333333930186E-5, longitude=2.1933333343326922E-5) Path Point: GeoPoint(latitude=34.06163, longitude=-117.82321) | Location Point : GeoPoint(latitude=34.06165115, longitude=-117.82325105) | Distance = 6.105624 | Residual: GeoPoint(latitude=-2.1150000002023717E-5, longitude=4.1049999992992525E-5) Path Point: GeoPoint(latitude=34.06151, longitude=-117.82341) | Location Point : GeoPoint(latitude=34.06153823333333, longitude=-117.82344766666667) | Distance = 6.105624 | Residual: GeoPoint(latitude=-2.8233333331684207E-5, longitude=3.766666667104346E-5) Path Point: GeoPoint(latitude=34.0614, longitude=-117.82358) | Location Point : GeoPoint(latitude=34.0614435, longitude=-117.8236108) | Distance = 6.105624 | Residual: GeoPoint(latitude=-4.3500000003859896E-5, longitude=3.079999999044958E-5) Path Point: GeoPoint(latitude=34.06135, longitude=-117.82369) | Location Point : GeoPoint(latitude=34.0613776, longitude=-117.8237402) | Distance = 6.105624 | Residual: GeoPoint(latitude=-2.7600000002792058E-5, longitude=5.020000000399705E-5)

80 Path Point: GeoPoint(latitude=34.06128, longitude=-117.82382) | Location Point : GeoPoint(latitude=34.0613126, longitude=-117.82386) | Distance = 6.105624 | Residual: GeoPoint(latitude=-3.2600000004379126E-5, longitude=3.999999999848569E-5) Path Point: GeoPoint(latitude=34.06122, longitude=-117.82391) | Location Point : GeoPoint(latitude=34.061269, longitude=-117.8239239) | Distance = 6.105624 | Residual: GeoPoint(latitude=-4.9000000004184585E-5, longitude=1.3899999999011925E-5) Path Point: GeoPoint(latitude=34.06115, longitude=-117.82398) | Location Point : GeoPoint(latitude=34.0612122, longitude=-117.8239934) | Distance = 6.105624 | Residual: GeoPoint(latitude=-6.220000000212167E-5, longitude=1.3400000000274304E-5) Path Point: GeoPoint(latitude=34.06111, longitude=-117.82402) | Location Point : GeoPoint(latitude=34.06112335, longitude=-117.82407455) | Distance = 6.105624 | Residual: GeoPoint(latitude=-1.3350000003242712E-5, longitude=5.4550000001540866E-5) Path Point: GeoPoint(latitude=34.06103, longitude=-117.82407) | Location Point : GeoPoint(latitude=34.0610316, longitude=-117.824149) | Distance = 6.105624 | Residual: GeoPoint(latitude=-1.5999999973814738E-6, longitude=7.899999999949614E-5) Path Point: GeoPoint(latitude=34.06087, longitude=-117.82414) | Location Point : GeoPoint(latitude=34.060940450000004, longitude=-117.82420785) | Distance = 6.105624 | Residual: GeoPoint(latitude=-7.04500000026087E-5, longitude=6.784999999354113E-5) Path Point: GeoPoint(latitude=34.06079, longitude=-117.82416) | Location Point : GeoPoint(latitude=34.0608174, longitude=-117.8242658) | Distance = 6.105624 | Residual: GeoPoint(latitude=-2.7400000000454838E-5, longitude=1.0580000000004475E-4) Path Point: GeoPoint(latitude=34.06071, longitude=-117.82418) | Location Point : GeoPoint(latitude=34.0607309, longitude=-117.8242878) | Distance = 6.105624 | Residual: GeoPoint(latitude=-2.0900000002654906E-5, longitude=1.0779999999499523E-4) Path Point: GeoPoint(latitude=34.06063, longitude=-117.82419) | Location Point : GeoPoint(latitude=34.06063815, longitude=-117.8243031) | Distance = 6.105624 | Residual: GeoPoint(latitude=-8.149999999318425E-6, longitude=1.130999999929827E- 4) Path Point: GeoPoint(latitude=34.06056, longitude=-117.82419) | Location Point : GeoPoint(latitude=34.0605505, longitude=-117.8243015) | Distance = 6.105624 | Residual: GeoPoint(latitude=9.500000004436515E-6, longitude=1.1150000000270666E- 4) Path Point: GeoPoint(latitude=34.06048, longitude=-117.82418) | Location Point : GeoPoint(latitude=34.0604824, longitude=-117.8242944) | Distance = 6.105624 | Residual: GeoPoint(latitude=-2.3999999996249244E-6, longitude=1.144000000010692E-4) Path Point: GeoPoint(latitude=34.06042, longitude=-117.82417) | Location Point : GeoPoint(latitude=34.0603997, longitude=-117.8242624) | Distance = 6.105624 |

81 Residual: GeoPoint(latitude=2.0300000002748675E-5, longitude=9.239999999977044E- 5) Path Point: GeoPoint(latitude=34.06036, longitude=-117.82415) | Location Point : GeoPoint(latitude=34.0603321, longitude=-117.8242273) | Distance = 6.105624 | Residual: GeoPoint(latitude=2.7900000006297887E-5, longitude=7.730000000094606E- 5) Path Point: GeoPoint(latitude=34.06034, longitude=-117.82414) | Location Point : GeoPoint(latitude=34.0602891, longitude=-117.8241932) | Distance = 6.105624 | Residual: GeoPoint(latitude=5.089999999796646E-5, longitude=5.3199999996422775E- 5) Path Point: GeoPoint(latitude=34.06022, longitude=-117.82406) | Location Point : GeoPoint(latitude=34.06019805, longitude=-117.82411884999999) | Distance = 6.105624 | Residual: GeoPoint(latitude=2.1950000004267167E-5, longitude=5.884999998784224E-5) Path Point: GeoPoint(latitude=34.06011, longitude=-117.82396) | Location Point : GeoPoint(latitude=34.0601101, longitude=-117.8240306) | Distance = 6.105624 | Residual: GeoPoint(latitude=-1.0000000116860974E-7, longitude=7.06000000008089E- 5) Path Point: GeoPoint(latitude=34.06008, longitude=-117.82393) | Location Point : GeoPoint(latitude=34.0600609, longitude=-117.8239759) | Distance = 6.105624 | Residual: GeoPoint(latitude=1.9099999995830785E-5, longitude=4.5899999989273965E-5) Path Point: GeoPoint(latitude=34.06002, longitude=-117.82385) | Location Point : GeoPoint(latitude=34.0599434, longitude=-117.82382633333333) | Distance = 6.105624 | Residual: GeoPoint(latitude=7.659999999987122E-5, longitude=- 2.3666666663757496E-5) Path Point: GeoPoint(latitude=34.05984, longitude=-117.82352) | Location Point : GeoPoint(latitude=34.05981845, longitude=-117.823581125) | Distance = 6.105624 | Residual: GeoPoint(latitude=2.1549999999592728E-5, longitude=6.112500000199361E- 5) Path Point: GeoPoint(latitude=34.05977, longitude=-117.82339) | Location Point : GeoPoint(latitude=34.0597262, longitude=-117.82343052222222) | Distance = 6.105624 | Residual: GeoPoint(latitude=4.38000000002603E-5, longitude=4.052222222128421E- 5) Path Point: GeoPoint(latitude=34.05952, longitude=-117.82362) | Location Point : GeoPoint(latitude=34.059590424999996, longitude=-117.823596325) | Distance = 6.105624 | Residual: GeoPoint(latitude=-7.042499999698748E-5, longitude=- 2.3675000008438474E-5) Path Point: GeoPoint(latitude=34.05947, longitude=-117.82371) | Location Point : GeoPoint(latitude=34.0595282, longitude=-117.823747) | Distance = 6.105624 | Residual: GeoPoint(latitude=-5.820000000511527E-5, longitude=3.699999999184911E- 5) Path Point: GeoPoint(latitude=34.05944, longitude=-117.82379) | Location Point : GeoPoint(latitude=34.0594951, longitude=-117.82382325) | Distance = 6.105624 | Residual: GeoPoint(latitude=-5.509999999731008E-5, longitude=3.325000000131695E- 5)

82 Path Point: GeoPoint(latitude=34.05942, longitude=-117.82382) | Location Point : GeoPoint(latitude=34.059400180000004, longitude=-117.82404867999999) | Distance = 6.105624 | Residual: GeoPoint(latitude=1.9819999998560434E-5, longitude=2.2867999999220956E-4) Path Point: GeoPoint(latitude=34.05908, longitude=-117.82457) | Location Point : GeoPoint(latitude=34.0592140125, longitude=-117.82449907499999) | Distance = 6.105624 | Residual: GeoPoint(latitude=-1.3401249999844822E-4, longitude=- 7.092500000283053E-5) Path Point: GeoPoint(latitude=34.05905, longitude=-117.82463) | Location Point : GeoPoint(latitude=34.05905872857143, longitude=-117.82487134285716) | Distance = 6.105624 | Residual: GeoPoint(latitude=-8.72857143008332E-6, longitude=2.4134285716570503E-4) Path Point: GeoPoint(latitude=34.05877, longitude=-117.82531) | Location Point : GeoPoint(latitude=34.058867375000005, longitude=-117.8252281) | Distance = 6.105624 | Residual: GeoPoint(latitude=-9.737500000284172E-5, longitude=- 8.189999999785869E-5) Path Point: GeoPoint(latitude=34.05865, longitude=-117.82556) | Location Point : GeoPoint(latitude=34.05864952, longitude=-117.82569240000001) | Distance = 6.105624 | Residual: GeoPoint(latitude=4.799999970828139E-7, longitude=1.32400000012467E-4) Path Point: GeoPoint(latitude=34.05838, longitude=-117.82623) | Location Point : GeoPoint(latitude=34.0584614, longitude=-117.82619864) | Distance = 6.105624 | Residual: GeoPoint(latitude=-8.139999999912106E-5, longitude=- 3.135999999415162E-5) Path Point: GeoPoint(latitude=34.05819, longitude=-117.82659) | Location Point : GeoPoint(latitude=34.0582852, longitude=-117.82664162500001) | Distance = 6.105624 | Residual: GeoPoint(latitude=-9.519999999696438E-5, longitude=5.162500001176795E-5) Path Point: GeoPoint(latitude=34.05807, longitude=-117.82687) | Location Point : GeoPoint(latitude=34.05813860000001, longitude=-117.82696436666667) | Distance = 6.105624 | Residual: GeoPoint(latitude=-6.860000000585842E-5, longitude=9.436666667284044E-5) Path Point: GeoPoint(latitude=34.05789, longitude=-117.8273) | Location Point : GeoPoint(latitude=34.0580063, longitude=-117.827274275) | Distance = 6.105624 | Residual: GeoPoint(latitude=-1.163000000019565E-4, longitude=- 2.572500000042055E-5) Path Point: GeoPoint(latitude=34.05781, longitude=-117.82749) | Location Point : GeoPoint(latitude=34.057908600000005, longitude=-117.82750215) | Distance = 6.105624 | Residual: GeoPoint(latitude=-9.860000000116997E-5, longitude=1.215000000343025E-5) Path Point: GeoPoint(latitude=34.05775, longitude=-117.82762) | Location Point : GeoPoint(latitude=34.0578236, longitude=-117.8276433) | Distance = 6.105624 | Residual: GeoPoint(latitude=-7.360000000034006E-5, longitude=2.3300000009385258E-5) Path Point: GeoPoint(latitude=34.05768, longitude=-117.82771) | Location Point : GeoPoint(latitude=34.0577458, longitude=-117.8277711) | Distance = 6.105624 |

83 Residual: GeoPoint(latitude=-6.580000000155906E-5, longitude=6.110000001058324E- 5) Path Point: GeoPoint(latitude=34.05761, longitude=-117.82778) | Location Point : GeoPoint(latitude=34.057609400000004, longitude=-117.82788005) | Distance = 6.105624 | Residual: GeoPoint(latitude=5.999999928008037E-7, longitude=1.0005000000035125E-4) Path Point: GeoPoint(latitude=34.05747, longitude=-117.82786) | Location Point : GeoPoint(latitude=34.0575228, longitude=-117.8279284) | Distance = 6.105624 | Residual: GeoPoint(latitude=-5.2799999998853764E-5, longitude=6.84000000035212E- 5) Path Point: GeoPoint(latitude=34.0574, longitude=-117.82788) | Location Point : GeoPoint(latitude=34.05741885, longitude=-117.82796450000001) | Distance = 6.105624 | Residual: GeoPoint(latitude=-1.8849999996461975E-5, longitude=8.450000001403168E-5) Path Point: GeoPoint(latitude=34.05735, longitude=-117.82789) | Location Point : GeoPoint(latitude=34.0573387, longitude=-117.8279605) | Distance = 6.105624 | Residual: GeoPoint(latitude=1.1299999997049781E-5, longitude=7.050000000674572E- 5) Path Point: GeoPoint(latitude=34.05732, longitude=-117.82789) | Location Point : GeoPoint(latitude=34.057298825000004, longitude=-117.82795999999999) | Distance = 6.105624 | Residual: GeoPoint(latitude=2.1174999993434085E-5, longitude=6.999999999379725E-5) Path Point: GeoPoint(latitude=34.05723, longitude=-117.82787) | Location Point : GeoPoint(latitude=34.0572512, longitude=-117.827948) | Distance = 6.105624 | Residual: GeoPoint(latitude=-2.1200000006160735E-5, longitude=7.80000000020209E- 5) Path Point: GeoPoint(latitude=34.05718, longitude=-117.82785) | Location Point : GeoPoint(latitude=34.05714005, longitude=-117.82790105000001) | Distance = 6.105624 | Residual: GeoPoint(latitude=3.99500000014541E-5, longitude=5.1050000010377516E-5) Path Point: GeoPoint(latitude=34.05704, longitude=-117.82779) | Location Point : GeoPoint(latitude=34.05701895, longitude=-117.8278464) | Distance = 6.105624 | Residual: GeoPoint(latitude=2.1050000000855107E-5, longitude=5.640000000539658E- 5) Path Point: GeoPoint(latitude=34.05693, longitude=-117.82774) | Location Point : GeoPoint(latitude=34.05688575, longitude=-117.82777855) | Distance = 6.105624 | Residual: GeoPoint(latitude=4.425000000196633E-5, longitude=3.854999999930442E- 5) Path Point: GeoPoint(latitude=34.05679, longitude=-117.82768) | Location Point : GeoPoint(latitude=34.056639540000006, longitude=-117.82766622) | Distance = 6.105624 | Residual: GeoPoint(latitude=1.5045999999330206E-4, longitude=- 1.3780000003293935E-5) Path Point: GeoPoint(latitude=34.05622, longitude=-117.82745) | Location Point : GeoPoint(latitude=34.05632663157895, longitude=-117.82755332105265) | Distance = 6.105624 | Residual: GeoPoint(latitude=-1.066315789444161E-4, longitude=1.0332105264865277E-4)

84 Path Point: GeoPoint(latitude=34.05613, longitude=-117.82745) | Location Point : GeoPoint(latitude=34.05606123333334, longitude=-117.82745193333334) | Distance = 6.105624 | Residual: GeoPoint(latitude=6.876666666499887E-5, longitude=1.9333333369786487E-6) Path Point: GeoPoint(latitude=34.05585, longitude=-117.82728) | Location Point : GeoPoint(latitude=34.055873375000004, longitude=-117.82737064999999) | Distance = 6.105624 | Residual: GeoPoint(latitude=-2.3375000004932645E-5, longitude=9.064999998997791E-5) Path Point: GeoPoint(latitude=34.0557, longitude=-117.82721) | Location Point : GeoPoint(latitude=34.055586375000004, longitude=-117.8272436) | Distance = 6.105624 | Residual: GeoPoint(latitude=1.1362499999734155E-4, longitude=3.3600000008959796E-5) Path Point: GeoPoint(latitude=34.05524, longitude=-117.82701) | Location Point : GeoPoint(latitude=34.05520868, longitude=-117.82708519999998) | Distance = 6.105624 | Residual: GeoPoint(latitude=3.1319999997947434E-5, longitude=7.519999998351068E-5) Path Point: GeoPoint(latitude=34.05479, longitude=-117.82681) | Location Point : GeoPoint(latitude=34.05482595714286, longitude=-117.82687061428571) | Distance = 6.105624 | Residual: GeoPoint(latitude=-3.595714286319662E-5, longitude=6.061428571513261E-5) Path Point: GeoPoint(latitude=34.05479, longitude=-117.82681) | Location Point : GeoPoint(latitude=34.05482595714286, longitude=-117.82687061428571) | Distance = 6.105624 | Residual: GeoPoint(latitude=-3.595714286319662E-5, longitude=6.061428571513261E-5) Path Point: GeoPoint(latitude=34.05484, longitude=-117.8267) | Location Point : GeoPoint(latitude=34.0547858, longitude=-117.8267211) | Distance = 6.105624 | Residual: GeoPoint(latitude=5.4200000001003446E-5, longitude=2.1099999997886698E-5) Path Point: GeoPoint(latitude=34.05487, longitude=-117.82665) | Location Point : GeoPoint(latitude=34.0548347, longitude=-117.826649) | Distance = 6.105624 | Residual: GeoPoint(latitude=3.530000000040445E-5, longitude=-9.999999974752427E- 7) Path Point: GeoPoint(latitude=34.05489, longitude=-117.82662) | Location Point : GeoPoint(latitude=34.0548851, longitude=-117.8266091) | Distance = 6.105624 | Residual: GeoPoint(latitude=4.9000000004184585E-6, longitude=- 1.0900000006586197E-5) Path Point: GeoPoint(latitude=34.05495, longitude=-117.82658) | Location Point : GeoPoint(latitude=34.0549509, longitude=-117.8265937) | Distance = 6.105624 | Residual: GeoPoint(latitude=-9.000000034120603E-7, longitude=1.3699999996674705E-5) Path Point: GeoPoint(latitude=34.05503, longitude=-117.82655) | Location Point : GeoPoint(latitude=34.0550163, longitude=-117.8265709) | Distance = 6.105624 | Residual: GeoPoint(latitude=1.3700000003780133E-5, longitude=2.089999999554948E- 5) Path Point: GeoPoint(latitude=34.0551, longitude=-117.82655) | Location Point : GeoPoint(latitude=34.0550985, longitude=-117.8265749) | Distance = 6.105624 |

85 Residual: GeoPoint(latitude=1.5000000033182914E-6, longitude=2.4899999999661304E-5) Path Point: GeoPoint(latitude=34.05518, longitude=-117.82659) | Location Point : GeoPoint(latitude=34.0551642, longitude=-117.8265816) | Distance = 6.105624 | Residual: GeoPoint(latitude=1.5799999999899228E-5, longitude=- 8.399999998687235E-6) Path Point: GeoPoint(latitude=34.05523, longitude=-117.82661) | Location Point : GeoPoint(latitude=34.0552087, longitude=-117.8266186) | Distance = 6.105624 | Residual: GeoPoint(latitude=2.1300000000223918E-5, longitude=8.600000001024455E- 6) Path Point: GeoPoint(latitude=34.0553, longitude=-117.82665) | Location Point : GeoPoint(latitude=34.0552673, longitude=-117.8266579) | Distance = 6.105624 | Residual: GeoPoint(latitude=3.2700000005547736E-5, longitude=7.899999999949614E- 6) Path Point: GeoPoint(latitude=34.05534, longitude=-117.82669) | Location Point : GeoPoint(latitude=34.0553424, longitude=-117.8266952) | Distance = 6.105624 | Residual: GeoPoint(latitude=-2.3999999996249244E-6, longitude=5.200000003924288E-6) Path Point: GeoPoint(latitude=34.05545, longitude=-117.82676) | Location Point : GeoPoint(latitude=34.0554159, longitude=-117.8267424) | Distance = 6.105624 | Residual: GeoPoint(latitude=3.410000000059199E-5, longitude=- 1.7599999992512494E-5) Path Point: GeoPoint(latitude=34.0555, longitude=-117.82677) | Location Point : GeoPoint(latitude=34.0554791, longitude=-117.8267785) | Distance = 6.105624 | Residual: GeoPoint(latitude=2.0900000002654906E-5, longitude=8.500000006961272E- 6) Path Point: GeoPoint(latitude=34.05558, longitude=-117.82677) | Location Point : GeoPoint(latitude=34.0555506, longitude=-117.8267941) | Distance = 6.105624 | Residual: GeoPoint(latitude=2.940000000251075E-5, longitude=2.410000000452328E- 5) Path Point: GeoPoint(latitude=34.05564, longitude=-117.82677) | Location Point : GeoPoint(latitude=34.0556302, longitude=-117.8267945) | Distance = 6.105624 | Residual: GeoPoint(latitude=9.79999999373149E-6, longitude=2.450000000919772E-5) Path Point: GeoPoint(latitude=34.05571, longitude=-117.82675) | Location Point : GeoPoint(latitude=34.0557057, longitude=-117.8267962) | Distance = 6.105624 | Residual: GeoPoint(latitude=4.300000000512227E-6, longitude=4.619999999988522E- 5) Path Point: GeoPoint(latitude=34.05577, longitude=-117.82674) | Location Point : GeoPoint(latitude=34.0557913, longitude=-117.8267823) | Distance = 6.105624 | Residual: GeoPoint(latitude=-2.1300000000223918E-5, longitude=4.230000000404743E-5) Path Point: GeoPoint(latitude=34.05583, longitude=-117.82672) | Location Point : GeoPoint(latitude=34.0558847, longitude=-117.8267572) | Distance = 6.105624 | Residual: GeoPoint(latitude=-5.469999999974107E-5, longitude=3.720000000839718E- 5)

86 Path Point: GeoPoint(latitude=34.05593, longitude=-117.82668) | Location Point : GeoPoint(latitude=34.0559607, longitude=-117.826733) | Distance = 6.105624 | Residual: GeoPoint(latitude=-3.070000000349182E-5, longitude=5.300000000829641E- 5) Path Point: GeoPoint(latitude=34.05607, longitude=-117.82662) | Location Point : GeoPoint(latitude=34.056051333333336, longitude=-117.82658488333334) | Distance = 6.105624 | Residual: GeoPoint(latitude=1.8666666662170428E-5, longitude=- 3.5116666666112906E-5) Path Point: GeoPoint(latitude=34.05607, longitude=-117.82662) | Location Point : GeoPoint(latitude=34.056051333333336, longitude=-117.82658488333334) | Distance = 6.105624 | Residual: GeoPoint(latitude=1.8666666662170428E-5, longitude=- 3.5116666666112906E-5) Path Point: GeoPoint(latitude=34.05597, longitude=-117.82621) | Location Point : GeoPoint(latitude=34.056028, longitude=-117.82626264999999) | Distance = 6.105624 | Residual: GeoPoint(latitude=-5.7999999995672624E-5, longitude=5.264999998644271E-5) Path Point: GeoPoint(latitude=34.05594, longitude=-117.82612) | Location Point : GeoPoint(latitude=34.0559536, longitude=-117.8260926) | Distance = 6.105624 | Residual: GeoPoint(latitude=-1.3600000002611523E-5, longitude=- 2.7400000007560266E-5) Path Point: GeoPoint(latitude=34.05589, longitude=-117.82597) | Location Point : GeoPoint(latitude=34.0558139, longitude=-117.82585417142857) | Distance = 6.105624 | Residual: GeoPoint(latitude=7.61000000011336E-5, longitude=- 1.1582857142400371E-4) Path Point: GeoPoint(latitude=34.05589, longitude=-117.82597) | Location Point : GeoPoint(latitude=34.0558139, longitude=-117.82585417142857) | Distance = 6.105624 | Residual: GeoPoint(latitude=7.61000000011336E-5, longitude=- 1.1582857142400371E-4) Path Point: GeoPoint(latitude=34.056, longitude=-117.82581) | Location Point : GeoPoint(latitude=34.0556705, longitude=-117.8256089) | Distance = 6.105624 | Residual: GeoPoint(latitude=3.294999999994275E-4, longitude=- 2.0109999999817774E-4) Root Mean Square Error Latitude: 5.979131832767509E-5 Root Mean Square Error Longitude: 5.979131832767509E-5 Root Mean Square Error Distance: 6.1056239999999974

Q. Building 112 Data Set

Path Point: GeoPoint(latitude=34.05908, longitude=-117.82457) | Location Point : GeoPoint(latitude=34.0590027, longitude=-117.8244360269231) | Distance = 4.19920 | Residual: GeoPoint(latitude=7.730000000094606E-5, longitude=- 1.3397307689899662E-4) Path Point: GeoPoint(latitude=34.05942, longitude=-117.82382) | Location Point : GeoPoint(latitude=34.05938758333334, longitude=-117.82401826666666) | Distance =

87 4.19920 | Residual: GeoPoint(latitude=3.241666666298215E-5, longitude=1.9826666665778703E-4) Path Point: GeoPoint(latitude=34.05944, longitude=-117.82379) | Location Point : GeoPoint(latitude=34.0594737, longitude=-117.8238045) | Distance = 4.19920 | Residual: GeoPoint(latitude=-3.369999999591755E-5, longitude=1.4499999991812729E-5) Path Point: GeoPoint(latitude=34.05947, longitude=-117.82371) | Location Point : GeoPoint(latitude=34.05950675, longitude=-117.82372365) | Distance = 4.19920 | Residual: GeoPoint(latitude=-3.6749999999585725E-5, longitude=1.3649999999643114E-5) Path Point: GeoPoint(latitude=34.05952, longitude=-117.82362) | Location Point : GeoPoint(latitude=34.059580000000004, longitude=-117.82354075999999) | Distance = 4.19920 | Residual: GeoPoint(latitude=-6.0000000004833964E-5, longitude=- 7.924000001935383E-5) Path Point: GeoPoint(latitude=34.05969, longitude=-117.82325) | Location Point : GeoPoint(latitude=34.059664225, longitude=-117.82335485000002) | Distance = 4.19920 | Residual: GeoPoint(latitude=2.577500000455757E-5, longitude=1.0485000001381195E-4) Path Point: GeoPoint(latitude=34.05969, longitude=-117.82325) | Location Point : GeoPoint(latitude=34.059664225, longitude=-117.82335485000002) | Distance = 4.19920 | Residual: GeoPoint(latitude=2.577500000455757E-5, longitude=1.0485000001381195E-4) Path Point: GeoPoint(latitude=34.05977, longitude=-117.82339) | Location Point : GeoPoint(latitude=34.05972594, longitude=-117.82338702) | Distance = 4.19920 | Residual: GeoPoint(latitude=4.406000000045651E-5, longitude=- 2.9800000049817754E-6) Path Point: GeoPoint(latitude=34.05984, longitude=-117.82352) | Location Point : GeoPoint(latitude=34.0599163, longitude=-117.8235478) | Distance = 4.19920 | Residual: GeoPoint(latitude=-7.629999999636539E-5, longitude=2.779999999802385E- 5) Path Point: GeoPoint(latitude=34.06002, longitude=-117.82385) | Location Point : GeoPoint(latitude=34.060022149999995, longitude=-117.82375074999999) | Distance = 4.19920 | Residual: GeoPoint(latitude=-2.1499999931506864E-6, longitude=- 9.925000000521322E-5) Path Point: GeoPoint(latitude=34.06008, longitude=-117.82393) | Location Point : GeoPoint(latitude=34.0600934, longitude=-117.8238485) | Distance = 4.19920 | Residual: GeoPoint(latitude=-1.3400000000274304E-5, longitude=- 8.15000000073951E-5) Path Point: GeoPoint(latitude=34.06011, longitude=-117.82396) | Location Point : GeoPoint(latitude=34.0601469, longitude=-117.8239107) | Distance = 4.19920 | Residual: GeoPoint(latitude=-3.6899999997785926E-5, longitude=- 4.930000000058499E-5) Path Point: GeoPoint(latitude=34.06022, longitude=-117.82406) | Location Point : GeoPoint(latitude=34.060232299999996, longitude=-117.82399649999999) | Distance = 4.19920 | Residual: GeoPoint(latitude=-1.2299999994525024E-5, longitude=- 6.350000001020817E-5)

88 Path Point: GeoPoint(latitude=34.06034, longitude=-117.82414) | Location Point : GeoPoint(latitude=34.0603478, longitude=-117.8240813) | Distance = 4.19920 | Residual: GeoPoint(latitude=-7.800000005886432E-6, longitude=- 5.8699999996747465E-5) Path Point: GeoPoint(latitude=34.06042, longitude=-117.82417) | Location Point : GeoPoint(latitude=34.0604245, longitude=-117.82412) | Distance = 4.19920 | Residual: GeoPoint(latitude=-4.500000002849447E-6, longitude=-5.000000000165983E-5) Path Point: GeoPoint(latitude=34.06048, longitude=-117.82418) | Location Point : GeoPoint(latitude=34.060511, longitude=-117.8241588) | Distance = 4.19920 | Residual: GeoPoint(latitude=-3.0999999999892225E-5, longitude=-2.119999999194988E-5) Path Point: GeoPoint(latitude=34.06063, longitude=-117.82419) | Location Point : GeoPoint(latitude=34.0606094, longitude=-117.8241806) | Distance = 4.19920 | Residual: GeoPoint(latitude=2.0600000006254504E-5, longitude=- 9.399999996162478E-6) Path Point: GeoPoint(latitude=34.06071, longitude=-117.82418) | Location Point : GeoPoint(latitude=34.060717, longitude=-117.8241742) | Distance = 4.19920 | Residual: GeoPoint(latitude=-6.999999996537554E-6, longitude=-5.7999999967250915E-6) Path Point: GeoPoint(latitude=34.06079, longitude=-117.82416) | Location Point : GeoPoint(latitude=34.0608077, longitude=-117.8241565) | Distance = 4.19920 | Residual: GeoPoint(latitude=-1.770000000078653E-5, longitude=- 3.500000005374204E-6) Path Point: GeoPoint(latitude=34.06087, longitude=-117.82414) | Location Point : GeoPoint(latitude=34.0608916, longitude=-117.8241409) | Distance = 4.19920 | Residual: GeoPoint(latitude=-2.159999999662432E-5, longitude=9.000000034120603E- 7) Path Point: GeoPoint(latitude=34.06103, longitude=-117.82407) | Location Point : GeoPoint(latitude=34.061014799999995, longitude=-117.8240472) | Distance = 4.19920 | Residual: GeoPoint(latitude=1.5200000007098424E-5, longitude=- 2.2800000010647636E-5) Path Point: GeoPoint(latitude=34.06115, longitude=-117.82398) | Location Point : GeoPoint(latitude=34.061149, longitude=-117.8239489) | Distance = 4.19920 | Residual: GeoPoint(latitude=9.999999974752427E-7, longitude=-3.1100000001060835E-5) Path Point: GeoPoint(latitude=34.06122, longitude=-117.82391) | Location Point : GeoPoint(latitude=34.0612286, longitude=-117.8238834) | Distance = 4.19920 | Residual: GeoPoint(latitude=-8.600000001024455E-6, longitude=- 2.6599999998211388E-5) Path Point: GeoPoint(latitude=34.06128, longitude=-117.82382) | Location Point : GeoPoint(latitude=34.0613054, longitude=-117.8238167) | Distance = 4.19920 | Residual: GeoPoint(latitude=-2.5400000005504353E-5, longitude=- 3.3000000030369847E-6) Path Point: GeoPoint(latitude=34.06135, longitude=-117.82369) | Location Point : GeoPoint(latitude=34.0613559, longitude=-117.8237219) | Distance = 4.19920 | Residual: GeoPoint(latitude=-5.900000004999129E-6, longitude=3.189999999619886E- 5)

89 Path Point: GeoPoint(latitude=34.0614, longitude=-117.82358) | Location Point : GeoPoint(latitude=34.0614136, longitude=-117.823645) | Distance = 4.19920 | Residual: GeoPoint(latitude=-1.3600000002611523E-5, longitude=6.499999999221018E-5) Path Point: GeoPoint(latitude=34.06151, longitude=-117.82341) | Location Point : GeoPoint(latitude=34.0614865, longitude=-117.82344140000001) | Distance = 4.19920 | Residual: GeoPoint(latitude=2.3499999997511622E-5, longitude=3.140000001167209E- 5) Path Point: GeoPoint(latitude=34.06163, longitude=-117.82321) | Location Point : GeoPoint(latitude=34.0616155, longitude=-117.82325345) | Distance = 4.19920 | Residual: GeoPoint(latitude=1.4499999998918156E-5, longitude=4.344999999261745E- 5) Path Point: GeoPoint(latitude=34.06171, longitude=-117.82305) | Location Point : GeoPoint(latitude=34.06173445, longitude=-117.82305735) | Distance = 4.19920 | Residual: GeoPoint(latitude=-2.44500000050607E-5, longitude=7.3500000041804014E- 6) Path Point: GeoPoint(latitude=34.06179, longitude=-117.82287) | Location Point : GeoPoint(latitude=34.0618386, longitude=-117.82284485) | Distance = 4.19920 | Residual: GeoPoint(latitude=-4.8599999999510146E-5, longitude=- 2.5149999999030115E-5) Path Point: GeoPoint(latitude=34.06184, longitude=-117.82263) | Location Point : GeoPoint(latitude=34.06189655, longitude=-117.8226584) | Distance = 4.19920 | Residual: GeoPoint(latitude=-5.655000000359678E-5, longitude=2.8399999990824654E-5) Path Point: GeoPoint(latitude=34.06188, longitude=-117.82245) | Location Point : GeoPoint(latitude=34.0619208, longitude=-117.8224815) | Distance = 4.19920 | Residual: GeoPoint(latitude=-4.080000000072914E-5, longitude=3.149999999152442E- 5) Path Point: GeoPoint(latitude=34.06193, longitude=-117.82239) | Location Point : GeoPoint(latitude=34.0619671, longitude=-117.8224328) | Distance = 4.19920 | Residual: GeoPoint(latitude=-3.7100000000123146E-5, longitude=4.2800000002785055E-5) Path Point: GeoPoint(latitude=34.06201, longitude=-117.82236) | Location Point : GeoPoint(latitude=34.0620134, longitude=-117.822396) | Distance = 4.19920 | Residual: GeoPoint(latitude=-3.399999997100167E-6, longitude=3.5999999994373866E-5) Path Point: GeoPoint(latitude=34.06206, longitude=-117.82238) | Location Point : GeoPoint(latitude=34.0620675, longitude=-117.8223829) | Distance = 4.19920 | Residual: GeoPoint(latitude=-7.499999995275175E-6, longitude=2.8999999983625457E-6) Path Point: GeoPoint(latitude=34.06211, longitude=-117.82242) | Location Point : GeoPoint(latitude=34.062121, longitude=-117.8223962) | Distance = 4.19920 | Residual: GeoPoint(latitude=-1.100000000064938E-5, longitude=-2.3799999993912024E-5) Path Point: GeoPoint(latitude=34.06214, longitude=-117.82246) | Location Point : GeoPoint(latitude=34.0621729, longitude=-117.8224183) | Distance = 4.19920 | Residual: GeoPoint(latitude=-3.290000000077953E-5, longitude=- 4.170000001124663E-5)

90 Path Point: GeoPoint(latitude=34.06216, longitude=-117.8225) | Location Point : GeoPoint(latitude=34.062221, longitude=-117.8224563) | Distance = 4.19920 | Residual: GeoPoint(latitude=-6.100000000230921E-5, longitude=-4.3700000006197115E-5) Path Point: GeoPoint(latitude=34.06219, longitude=-117.82256) | Location Point : GeoPoint(latitude=34.0622659, longitude=-117.822536) | Distance = 4.19920 | Residual: GeoPoint(latitude=-7.589999999879637E-5, longitude=-2.3999999996249244E-5) Path Point: GeoPoint(latitude=34.06223, longitude=-117.82264) | Location Point : GeoPoint(latitude=34.0623048, longitude=-117.8225972) | Distance = 4.19920 | Residual: GeoPoint(latitude=-7.480000000015252E-5, longitude=- 4.2800000002785055E-5) Path Point: GeoPoint(latitude=34.06227, longitude=-117.82277) | Location Point : GeoPoint(latitude=34.06235, longitude=-117.8226845) | Distance = 4.19920 | Residual: GeoPoint(latitude=-8.000000000407681E-5, longitude=-8.550000001150693E-5) Path Point: GeoPoint(latitude=34.0623, longitude=-117.82286) | Location Point : GeoPoint(latitude=34.0623949, longitude=-117.82280835) | Distance = 4.19920 | Residual: GeoPoint(latitude=-9.490000000056398E-5, longitude=- 5.165000000317832E-5) Path Point: GeoPoint(latitude=34.06235, longitude=-117.82302) | Location Point : GeoPoint(latitude=34.0624401, longitude=-117.8229784) | Distance = 4.19920 | Residual: GeoPoint(latitude=-9.010000000131413E-5, longitude=- 4.160000000297259E-5) Path Point: GeoPoint(latitude=34.06237, longitude=-117.82313) | Location Point : GeoPoint(latitude=34.0624643, longitude=-117.8231215) | Distance = 4.19920 | Residual: GeoPoint(latitude=-9.430000000065775E-5, longitude=- 8.500000006961272E-6) Path Point: GeoPoint(latitude=34.06239, longitude=-117.82321) | Location Point : GeoPoint(latitude=34.0624625, longitude=-117.8232395) | Distance = 4.19920 | Residual: GeoPoint(latitude=-7.250000000169621E-5, longitude=2.9499999996573933E-5) Path Point: GeoPoint(latitude=34.06244, longitude=-117.82337) | Location Point : GeoPoint(latitude=34.0624825, longitude=-117.8233338) | Distance = 4.19920 | Residual: GeoPoint(latitude=-4.2499999999279225E-5, longitude=- 3.6199999996711085E-5) Path Point: GeoPoint(latitude=34.06247, longitude=-117.82344) | Location Point : GeoPoint(latitude=34.0624992, longitude=-117.8234227) | Distance = 4.19920 | Residual: GeoPoint(latitude=-2.920000000017353E-5, longitude=- 1.7300000010322947E-5) Path Point: GeoPoint(latitude=34.06253, longitude=-117.82357) | Location Point : GeoPoint(latitude=34.0625507, longitude=-117.82354240000001) | Distance = 4.19920 | Residual: GeoPoint(latitude=-2.0700000000317686E-5, longitude=- 2.759999999568663E-5) Path Point: GeoPoint(latitude=34.06263, longitude=-117.82371) | Location Point : GeoPoint(latitude=34.06264915, longitude=-117.8236962) | Distance = 4.19920 | Residual: GeoPoint(latitude=-1.9149999999967804E-5, longitude=- 1.3800000004948743E-5)

91 Path Point: GeoPoint(latitude=34.06279, longitude=-117.82394) | Location Point : GeoPoint(latitude=34.06275085, longitude=-117.82385175) | Distance = 4.19920 | Residual: GeoPoint(latitude=3.914999999921065E-5, longitude=-8.824999999035299E- 5) Path Point: GeoPoint(latitude=34.06285, longitude=-117.82401) | Location Point : GeoPoint(latitude=34.0628349, longitude=-117.8239732) | Distance = 4.19920 | Residual: GeoPoint(latitude=1.5099999998824387E-5, longitude=- 3.6800000003722744E-5) Path Point: GeoPoint(latitude=34.06287, longitude=-117.82404) | Location Point : GeoPoint(latitude=34.0629054, longitude=-117.8240414) | Distance = 4.19920 | Residual: GeoPoint(latitude=-3.540000000157306E-5, longitude=1.4000000021496817E-6) Path Point: GeoPoint(latitude=34.0629, longitude=-117.82411) | Location Point : GeoPoint(latitude=34.0629461, longitude=-117.8241091) | Distance = 4.19920 | Residual: GeoPoint(latitude=-4.609999999871661E-5, longitude=- 9.000000034120603E-7) Path Point: GeoPoint(latitude=34.06296, longitude=-117.82422) | Location Point : GeoPoint(latitude=34.0629905, longitude=-117.8241885) | Distance = 4.19920 | Residual: GeoPoint(latitude=-3.0500000001154604E-5, longitude=- 3.149999999152442E-5) Path Point: GeoPoint(latitude=34.06298, longitude=-117.8243) | Location Point : GeoPoint(latitude=34.0630251, longitude=-117.8242653) | Distance = 4.19920 | Residual: GeoPoint(latitude=-4.509999999413594E-5, longitude=- 3.470000000049822E-5) Path Point: GeoPoint(latitude=34.06301, longitude=-117.82441) | Location Point : GeoPoint(latitude=34.0630698, longitude=-117.8243653) | Distance = 4.19920 | Residual: GeoPoint(latitude=-5.9800000002496745E-5, longitude=- 4.470000000367236E-5) Path Point: GeoPoint(latitude=34.06303, longitude=-117.82452) | Location Point : GeoPoint(latitude=34.06308075, longitude=-117.82449585) | Distance = 4.19920 | Residual: GeoPoint(latitude=-5.074999999976626E-5, longitude=- 2.4150000001554872E-5) Path Point: GeoPoint(latitude=34.06304, longitude=-117.82461) | Location Point : GeoPoint(latitude=34.063082933333334, longitude=-117.82472446666667) | Distance = 4.19920 | Residual: GeoPoint(latitude=-4.293333333293958E-5, longitude=1.1446666665904104E-4) Path Point: GeoPoint(latitude=34.06299, longitude=-117.82515) | Location Point : GeoPoint(latitude=34.0629818, longitude=-117.82501823888889) | Distance = 4.19920 | Residual: GeoPoint(latitude=8.199999996350016E-6, longitude=- 1.3176111110624333E-4) Path Point: GeoPoint(latitude=34.06299, longitude=-117.82515) | Location Point : GeoPoint(latitude=34.0629818, longitude=-117.82501823888889) | Distance = 4.19920 | Residual: GeoPoint(latitude=8.199999996350016E-6, longitude=- 1.3176111110624333E-4) Path Point: GeoPoint(latitude=34.06267, longitude=-117.8246) | Location Point : GeoPoint(latitude=34.0626966625, longitude=-117.82468057812501) | Distance =

92 4.19920 | Residual: GeoPoint(latitude=-2.6662500005159018E-5, longitude=8.057812500794626E-5) Root Mean Square Error Latitude: 4.280093507626858E-5 Root Mean Square Error Longitude: 4.280093507626858E-5 Root Mean Square Error Distance: 4.1991999999999985

93