Building a Webpart to Display a Virtual Earth Map
Necessary Components and Setup
The items you will read about in this article came about as a result of some project work that I've been doing for the Indianapolis Colts. I've been helping to lead efforts to build and launch myColts.net, a social networking site for Colts fans. I got in to a discussion at the Microsoft MVP summit around the idea of a mashup, which is about using multiple online services to create a new one; that inspired me to play around with Virtual Earth.
The webpart display in the example relies on the native functionality contained within ASP.NET. For the purposes of this article, I'm not going to go in to all of the background setup that took place to get the web site set up to display webparts. Rather, I'm going to assume that the readership already has a site setup that will display a webpart. Worst case, you could just as easily toss the webpart portion and put the code in a page instead.
Microsoft Virtual Earth
To produce a map using Virtual Earth, you need address data to feed in to create the map. There is a geography-related RSS format that is widely accepted and can be used. In this example, you'll display a map of the location of the top groups on myColts.net. For this, I used the zip code of the group locations and got the latitude and longitudinal data from a geo-targeting data provider. Here is a data sample with a few records.
<rss version=\"2.0\" xmlns:geo=\"http://www.w3.org/2003/01/geo/ wgs84_pos#\"><channel> <title>Group Addresses</title> <item> <title>Help</title> <description>Category: Computers & Internet, Members: 2136, New Members: 58</description> <geo:lat>39.8512</geo:lat> <geo:long>-86.2651</geo:long> </item> <item> <title>ColtsDrive</title> <description>Category: Recreation & Sports, Members: 95, New Members: 2</description> <geo:lat>39.8884</geo:lat> <geo:long>-86.3109</geo:long> </item> <item> <title>Tailgaters</title> <description>Category: Recreation & Sports, Members: 38, New Members: 1</description> <geo:lat>44.8139</geo:lat> <geo:long>-93.9194</geo:long> </item> <!--Repeat data cut--></channel></rss>
The data feed you will use for Virtual Earth is based on an RSS feed. To create the RSS feed within myColts.net, you use an HttpHandler. A custom HttpHandler allows you to have requests with a specific filename extension assigned to the custom handler. The custom extension in this case was arbitrarily set up as .geodata and registered as such in the web.config. Please refer to my prior article, "Use Custom HTTP Handlers in Your ASP.NET Applications," for more information on handlers. When you build your display control, you'll have it request a file with a .georss file extension on it, which in turn triggers the HttpHandler to dynamically build the RSS output necessary to feed Virtual Earth.
The following entry was put in the web.config to register the handler.
<add verb="*" path="*.georss" type="MyColts.Net.Handler.GeoData" validate="false"/>
The following example code should give you an idea of how I went about producing the RSS feed that is required. You'll have to adjust the part of the code where I retrieve the data to match your own. You could just as easily feed the static XML to make it easy for testing purposes. In this example, I'm using a strongly typed dataset to retrieve data from the database. I then create an XML output. I could have used the native capability of SQL Server to create XML output, but decided just to use a base query for those who may not have SQL Server. Kindly replace the data retrieval with whatever data source you choose.