By Troy Pullis | Article Rating: |
|
December 12, 2005 05:15 PM EST | Reads: |
95,554 |
Recently I was tasked with improving our Web site's Reseller Locator application. This tool helps potential customers in the U.S. find a product reseller in their state. By choosing a state from a drop-down box, a listing of all resellers located in that state is displayed.
Over the years, as more and more resellers have signed on to sell our products, some problems with this application have surfaced:
- Some states, such as California, display a very long list of resellers, and customers may never contact those listed near the bottom.
- The states with smaller populations such as North Dakota may not have any resellers to list.
- Competitors could use the tool to easily find all our resellers, and may steal these valuable partner relationships.
We needed a solution to solve these problems, and searching by zip codes appeared to be the answer. The new tool would ask the customer to enter their five digit zip code in a text box and select a search radius of 25, 50, or 100 miles. We wanted to limit the search to 100 miles, to keep the results to an appropriate number and prevent our competitors from entering 2,000 miles and getting a huge list all at once. For example, I might search for all resellers within 50 miles of 55113. This time a list of resellers in close proximity to St. Paul, MN, is displayed, ignoring those 200 miles north in the city of Duluth. Implementing this approach addressed each problem, respectively:
- A shorter list would result from the search, containing only the resellers located near the customer's zip code.
- The list can cross state boundaries, now that it will find all resellers located within the specified radius to the customer, and hopefully would show results for zip codes in states like North Dakota.
- Competitors can still use the tool to find our resellers, but they'll have to work much harder to get the information with the 100 mile limit.
I've used many store locator Web applications, such as finding the nearest Quiznos or Best Buy, and always wondered how they worked. Now I had the opportunity to learn something brand new, and I began my quest for how to accomplish the Reseller Locator zip code search by starting where everybody does: Google! I quickly found a great tutorial article with sample ColdFusion code on webmonkey.com. The article was written by Robert Capili and titled Proximity Searches for Fun and Profit. The stars were aligned that day, since Robert published his article three weeks before I started my project. It was perfect timing, because as I started reading, it became apparent that this was exactly what I needed to get my feet wet. In the article Robert discusses four primary ways to calculate zip code proximities:
- Pythagorean Theorem (remember this trig equation? a2 + b2 = c2)
- Spherical Law of Cosines (Pythagorean theorem for triangles drawn on a sphere)
- Haversine Formula (most accurate way to calculate distance on a sphere)
- Square Search (Robert's speedy solution)
Testing the Sample Code
Included in the sample code is a ColdFusion Component, zipfinder.cfc, that implements each of the four search methods. It also contains a testing template, zip.cfm, that has a basic search form, containing a zip code text box and radius text box. Finally, it contains a database file, zipDB. My first step to getting set up was a quick visit to our company's DB Admin, who helped me perform a restore of the SQL database file, zipDB. The database restore creates a single table that contains 29,470 zip code records. Next, I opened Application.cfm and modified the variable application.dsn to use the correct value for our datasource name. Now on to some real testing. I pointed my browser to the zip.cfm template and saw the search form. After entering a zip code and radius in the text boxes, what you get are four cfdumps of the recordsets returned from the CFC, as well as the execution times. Each query gets the city, state, zip code, and distance from the specified zip code. Table 1 and Table 2 show the partial output from a search of 55113.
I soon realized why he recommended the Square Search. The execution time was faster than each of the other methods, and the distance results were very close to the Haversine Formula. After a few more tests, it was soon time to put the final pieces together.
Integrating the Solution
Now I needed to take the recordset returned by the Square Search method and put it to use in my application. We have a database table (actually a view) of resellers that includes the field: zipcode. Nothing special here; most of us are familiar with SQL tables that contain address information broken out in separate fields. All I needed to do was create a new query against the reseller table, and make sure a reseller's zip code was found among the zip codes in the recordset returned by the CFC. The code and query looked like this:
<cfinvoke component="zipfinder" method="squareSearch" radius="#URL.miles#"
zip="#URL.zip#" returnvariable="results"></cfinvoke>
<cfif NOT results.recordcount>
Sorry, no zip codes found within #URL.miles# miles of #URL.zip#.
<cfabort>
</cfif>
<cfquery name="get_resellers" datasource="#dsn#">
select *
from PartnerView
where zipcode IN (#ListQualify(ValueList(results.zip),"'")#)
and Country = 'USA'
order by CompanyName
</cfquery>
The first block of code invokes the CFC, calling the SquareSearch method. Next, I verify at least one record is returned. If not, I stop right there and let the user know with a friendly error message. Last, I perform a search against our resellers, using the clause:
where zipcode IN (#ListQualify(ValueList(results.zip),"'")#)
Based on the sample records I listed earlier, the actual query might look like:
select *
from PartnerView
where zipcode IN ('55113','55108','55117','55103','55114','55104','55414','55101','55418')
and Country = 'USA'
order by CompanyName
The ListQualify() and ValueList() ColdFusion functions come in handy here. ValueList() converts a query column into a comma-delimited list, then ListQualify() slaps a single quote around each item in the list. This is exactly what is needed to use as the expression on the right-hand side of the IN clause. All that's left is to display the results from the get_resellers query in a nice HTML format, and the customer has the information he or she needs to make a couple of phone calls that will hopefully lead to a future sale!
Published December 12, 2005 Reads 95,554
Copyright © 2005 SYS-CON Media, Inc. — All Rights Reserved.
Syndicated stories and blog feeds, all rights reserved by the author.
More Stories By Troy Pullis
Troy Pullis works as a senior Web developer for Secure Computing Corporation (www.securecomputing.com) and also manages the Twin Cities ColdFusion Users Group (www.colderfusion.com). He is a Certified Advanced CFMX Developer. Back in 1999, Troy shifted his client/server Java programming career to focus on the Internet boom. He immediately started using ColdFusion, began attending CFUG meetings, and has never looked back.
![]() |
CFDJ News Desk 12/15/05 06:33:24 PM EST | |||
Building a Zip Code Proximity Search with ColdFusion. Recently I was tasked with improving our Web site's Reseller Locator application. This tool helps potential customers in the U.S. find a product reseller in their state. By choosing a state from a drop-down box, a listing of all resellers located in that state is displayed. |
![]() |
CFDJ News Desk 12/15/05 06:03:25 PM EST | |||
Building a Zip Code Proximity Search with ColdFusion. Recently I was tasked with improving our Web site's Reseller Locator application. This tool helps potential customers in the U.S. find a product reseller in their state. By choosing a state from a drop-down box, a listing of all resellers located in that state is displayed. |
- Cloud People: A Who's Who of Cloud Computing
- Cloud Expo Silicon Valley: This Is Your Career on OpenStack
- Eleven Tips to Becoming a Better Performance Engineer
- Disaster Recovery Ascends to the Cloud, Part I
- The Cloud: Floor Wax or Dessert Topping?
- Simplifying Cloud Development
- Stuck in the Mire Getting Java Apps to the Cloud?
- Public, Private Cloud Markets Set to Soar as Enterprise Adoption Grows
- More Modernizing Data Protection, Virtualization and Clouds with Certainty
- Load Testing in Clustered Environments
- TBlox Named “Bronze Sponsor” of Cloud Expo Silicon Valley
- The BYOD That Is Real
- Cloud People: A Who's Who of Cloud Computing
- Cloud Expo Silicon Valley: This Is Your Career on OpenStack
- Eleven Tips to Becoming a Better Performance Engineer
- Disaster Recovery Ascends to the Cloud, Part I
- The Cloud: Floor Wax or Dessert Topping?
- Simplifying Cloud Development
- Stuck in the Mire Getting Java Apps to the Cloud?
- Public, Private Cloud Markets Set to Soar as Enterprise Adoption Grows
- More Modernizing Data Protection, Virtualization and Clouds with Certainty
- Load Testing in Clustered Environments
- TBlox Named “Bronze Sponsor” of Cloud Expo Silicon Valley
- The BYOD That Is Real
- Where Are RIA Technologies Headed in 2008?
- The Next Programming Models, RIAs and Composite Applications
- AJAX World RIA Conference & Expo Kicks Off in New York City
- Constructing an Application with Flash Forms from the Ground Up
- Building a Zip Code Proximity Search with ColdFusion
- CFEclipse: The Developer's IDE, Eclipse For ColdFusion
- Personal Branding Checklist
- Has the Technology Bounceback Begun?
- Adobe Flex 2: Advanced DataGrid
- i-Technology Viewpoint: We Need Not More Frameworks, But Better Programmers
- Passing Parameters to Flex That Works
- Web Services Using ColdFusion and Apache CXF