Mapping with a GPS and VB.NET

Introduction

This article shall describe a very simple approach to working with a GPS device within the context of a Visual Basic 2005 application. This article does not address how the GPS device works or everything that can be gleaned from the NEMA 0183 string outputted from most GPS devices; rather, the article is intended for those just interested in getting the present position from a GPS and using that point to do something interesting like show you where you are on a map.

Nothing exotic or expensive was used in this project; the GPS source was provided by my Garmin eTrex Legend handheld GPS purchased for about $100.00 (a nice little GPS but not the high end to be sure). Since my laptop provides no male serial ports, in order to connect the device I needed an adapter; for this I opted to purchase a Belkin Serial Port to USB adapter (an F5U109) which works great; the cable used to connect the device to a computer was provided with the device.

Figure 1: Getting the present position from the GPS.

To make matters more interesting than just outputting the present position, I provided the means to map the point directly into Google Maps using the query string accepted on that site populated with the current latitude and longitude of the device. I had published something similar on VB.NET Heaven a while back but without the GPS interface provided. Interestingly enough (but not surprising), if you compare the present position of the device as shown on the map versus the physical address when plotted on Google Maps, you will likely note that the GPS position is more accurate than the geocoded physical address.

NOTE: In order to retrieve the present position from the GPS device, it is necessary to configure the device to output the NEMA 0183 complaint string. Refer to your owner’s manuals to determine how to set that up with whatever device you may be using.

Figure 2: Google Maps showing the plotted present position.

Getting Started

The solution contains a single Windows Forms project called ReadGPS which was written in Visual Basic 2005; the application contains two forms (frmPP.vb, frmMap.vb) and all of the code necessary to drive the application is contained in those two form classes.

Figure 3: Solution Explorer with the Project Visible.

Code: Main Form (frmPP.vb)

All of the code necessary to derive present position from a GPS device is contained in this single form; the form shall be described entirely in this section.

Following the imports and the declaration of the Form class, the next order of business in the application is to declare a collection of member variables requiring form wide scope; these variables are contained in a defined region entitled Member Variables. The declaration of the variables follows:

#Region "Member Variables"
' Local variables used to hold the present' position as latitude and longitudePublic Latitude AsStringPublic Longitude AsString#End Region

The form designer contains a single serial port control along with some text boxes used to display present position as latitude and longitude, and two buttons, one of which is used to turn on and off automatic updating of present position and the other which serves to map the present position in Google Maps. The form also contains a timer control used to automatically update the coordinates, and a menu strip control which contains menu options used to change the COM port and to exit the application.

The next block of code in the Form class is the constructor; in this instance, the constructor is used to try to open the serial port given its default configuration as set in the property pages at design time. For some of the properties associated with the control, it might make sense to allow for runtime configuration changes but, aside from the COM port used to attach the device to the computer, the control is properly configured to work with the GPS device; review the settings for the serial port control in the IDE to review the settings applied.

Aside from using the wrong port setting, there is little that can go wrong here but if the initial attempt to open the port fails, the constructor will display a message box showing the user the reason for the connection failure. A failure also disables the timer control used to command present position updates and alters the text on the button used to manually disable the update timer.

Following the constructor, the event handlers used within the application are coded. The first is the timer control’s tick event; this is the heart of the application in terms of getting the latitude and longitude extracted from the NEMA 0183 string outputted from the device.

The code first checks to see if the serial port is open and, if it is, it reads the output of the device into a string variable. The string is split on the dollar sign symbol to break it up into a string array with each of the subordinate strings contained in the output. We are looking for a string beginning with GPGGA; this substring contains the latitude and longitude information we are looking for and it is comma delimited.

The whole GPGGA section contains other information besides latitude and longitude (such as time of day information, elevation, the number of satellites tracked, etc.). There are only four parts of the GPGGA section that we want, those sections contain the coordinates and the ordinals defining the position. The rest of the code converts the returned values into decimal degrees and passes them to the latitude and longitude member variables.

If we have valid coordinates, the function also enables the button used to map the point into Google Maps. If the values returned are invalid, the form will display GPS Unavailable in the latitude and longitude text boxes. If the serial port is closed, the latitude and longitude text boxes will be used to display the message COM Port Closed; in either case, the mapping button is also disabled.

The following button click event handler is used to enable or disable the timer used to automatically update the present position value shown in the form. The click event handler will also alter the text displayed on the button in response to enabling or disabling the timer.

The next bit of code is used to open up the Map form; the Map form accepts a latitude and longitude as arguments. These arguments are passed to the new form and used to display the current location on the map.

That wraps up the sum of the code used to communicate with the GPS device and to display the present position latitude and longitude from the NEMA 0183 string.

Code: Map Form (frmMap.vb)

This Form class is used to display the position captured from the GPS device through Google Maps. The form contains only a single web browser control. The code contained in the class is used to form a query string around the latitude and longitude passed to the form whenever it is instantiated. Once the query string is assembled, the browser is commanded to navigate to the location indicated in that string.

Summary

This article was intended to demonstrate a convenient means for capturing present position information from a GPS device linked to a computer through a serial port. The project could easily be extended by reviewing the contents of the NEMA 0183 standard and picking out additional information from the information captured from a GPS device.

Hi guys, i am very new to this VB.NET environment, and i am budding programmer, i just downloaded this source code and tried to run it, it says "com 4" does not exist. i tried different com viz com 1,2,3,4,5 it all gives same error. what should i do now? Any suggestions??? please help.

I greatly appreciate this work you have done for GPS. I wanted to know there was a way to save the GPS LAT/LONG and Time to a file that I could import into Excel or just a regular text file using the same timing you have for the updated coords.

In terms of the USB comport, if I unplug the USB GPS and plug into a different port then it changes the COM # and I have to go in and change the COM port in the drop down menu. I would like it to be dynamic to follow the USB and not the COM port.

I have a question about Google maps and this method of retrieving a map. I read somewhere that if you download the same map too many times from Google, they will blacklist you. Is there a way that we could cache the downloaded map to use again the next time we want to read the same map ? Which could be many times if your GPS is moving and you need to update your position. Of course then you would have to scale the map, probably using top left and bottom right corners, and then draw the new location on the map.

Thanks for the comments; that is an interesting point on Google and I had not heard that. Of course if someone wanted to make frequent use of Google Maps the best thing to do would be to join the Google Maps developers crowd to gain access to their toolkit. The same thing could be done with Virtual Earth or Yahoo! Maps. It would also be work taking a look as some of the opensource GIS initiatives such as SharpMap or even at something like MapObjects or the ArcGIS developer's toolkit available through ESRI.

Once I had programmed a Google Ranking Tool and I was searching through Google search pages. I had same problem when I was requesting 50 pages for each keyword. I was deleting Google cookies from Temporary Internet Files and I was able to continue to searching pages.