Author |
Topic |
Rekha
Starting Member
14 Posts |
Posted - 2007-06-21 : 03:29:44
|
There's a table companysite which will have longitude and latitude info based on city.We will have a new web portal, I would like the business to do a query like this: Give me all of the companysites within a 25 mile radius of <some city>.We should be able to calculate which long/lat values would fall in this range. Please help  |
|
Ifor
Aged Yak Warrior
700 Posts |
Posted - 2007-06-21 : 06:05:40
|
The great circle distance should be accurate enough. Here is my function. You may want to slightly alter the radius of the sphere depending on where you live.SET QUOTED_IDENTIFIER ON GOSET ANSI_NULLS ON GOCREATE FUNCTION dbo.GreatCircleDistance( @Latitude1 float = NULL, @Longitude1 float = NULL, @Latitude2 float = NULL, @Longitude2 float = NULL)RETURNS floatASBEGIN IF @Latitude1 IS NULL RETURN 0.0 IF @Longitude1 IS NULL RETURN 0.0 IF @Latitude2 IS NULL RETURN 0.0 IF @Longitude2 IS NULL RETURN 0.0 DECLARE @sin1 float ,@sin2 float ,@sind float ,@cos1 float ,@cos2 float ,@cosd float SELECT @sin1 = SIN(RADIANS(@Latitude1)) ,@sin2 = SIN(RADIANS(@Latitude2)) ,@sinD = SIN(RADIANS(@Longitude2 - @Longitude1)) ,@cos1 = COS(RADIANS(@Latitude1)) ,@cos2 = COS(RADIANS(@Latitude2)) ,@cosD = COS(RADIANS(@Longitude2 - @Longitude1)) RETURN ATN2 (SQRT(SQUARE(@cos2 * @sinD) + SQUARE(@cos1 * @sin2 - @sin1 * @cos2 * @cosD)) ,@sin1 * @sin2 + @cos1 * @cos2 * @cosD ) * 3959.871ENDGO |
 |
|
Rekha
Starting Member
14 Posts |
Posted - 2007-06-21 : 06:35:00
|
Hi,Thanx for the responsebut why 2 latitudes & longitudes.If the user selects city "California" for eg.It will have latitude & longitude stoder in DB which can be retreived now i need to know other cities which comes within 25 miles of California's lat & long.How do I do it? |
 |
|
Ifor
Aged Yak Warrior
700 Posts |
Posted - 2007-06-21 : 07:07:07
|
quote: but why 2 latitudes & longitudes?
Distance is between two points!Something like the following should give you sites within 25 miles of any city in California.SELECT * ,dbo.GreatCircleDistance(C.Latitude, C.Longitude, S.Latitude, S.Longitude) AS MilesFROM City C JOIN CompanySite S ON dbo.GreatCircleDistance(C.Latitude, C.Longitude, S.Latitude, S.Longitude) <= 25.0WHERE C.State = 'CA' |
 |
|
Kristen
Test
22859 Posts |
Posted - 2007-06-21 : 08:24:48
|
I recommend that you don't use the Great Circle algorithm as part of your FROM/JOIN, its too slow for any reasonably sized database, and precludes use of indexes.First imagine a SQUARE that has a centre on your Target City, and has sides 2 x 25 miles.Calculate the Lat / Long for the corners.You now need to find all companysites within that square. It is best to have the Lat / Long columns of the table indexed to make this fast:SELEFT companysite, Lat, LongFROM MyTableWHERE Lat >= @MinLat AND Lat <= @MaxLat AND Long >= @MinLong AND Long <= @MaxLong If a "square" is good enough you are done. If you need a CIRCLE based on the centre of your Target City then further-process THESE RESULTS ONLY through the Great Circle algorithm. But frankly for a granularity of 1 mile Pythagoras is just fine, and faster than Great Circle as there are no Trigonometric functions involved.See also http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=55210&SearchTerms=Distance+of+Zip,PostcodesKristen |
 |
|
Michael Valentine Jones
Yak DBA Kernel (pronounced Colonel)
7020 Posts |
Posted - 2007-06-21 : 09:04:22
|
This link has a function for the Great Circle Distance using the Haversine Formula, which has less trouble with shorter distances. It returns kilometers, but you can just change the radius to a value for miles to get results in miles.The thread also has considerable discussion of the other issues, including squaring the circle as discussed below. The problem of finding the limits of the square around the circle are not as simple as it seems, so you have to take care to get limits that actually include the entire search circleGreat Circle Distance Function - Haversine Formulahttp://www.sqlteam.com/forums/topic.asp?TOPIC_ID=81360CODO ERGO SUM |
 |
|
Kristen
Test
22859 Posts |
Posted - 2007-06-21 : 11:20:42
|
"The problem of finding the limits of the square around the circle are not as simple as it seems"Didn't know that ... |
 |
|
Michael Valentine Jones
Yak DBA Kernel (pronounced Colonel)
7020 Posts |
Posted - 2007-06-21 : 13:49:24
|
quote: Originally posted by Kristen "The problem of finding the limits of the square around the circle are not as simple as it seems"Didn't know that ...
The basic issue is this:Suppose you want to search inside a 50 mile diameter circle. You want to find a square that has borders 50 miles north/south/east/west of your position. If you measure the distance directly along the Latitude line for 50 miles, using the assumption that the Earth is a flat plane, the Great Circle Distance to that point will actually be slightly less than 50 miles unless you are on the equator, because the shortest distance to that point is not along the Latitude line. So you have to find points that are actually 50 mile east and west of your position using the Great Circle Distance.The larger the search circle, the greater the difference between the Great Circle Distance and the distance along the Latitude line, so the problem becomes even larger with larger search circles.CODO ERGO SUM |
 |
|
dmbware
Starting Member
4 Posts |
Posted - 2008-12-01 : 23:33:55
|
I don't know if this will work but If I have a DB of addresses and coordinates. Is there a way for me to compare one address (coordinate) against a DB and return all coordinates that fall within one square mile? |
 |
|
|