Do you know where your variables are? PerlMonks

### Re: Re: Zipcode Proximity script

by paulbort (Hermit)
 on Mar 31, 2003 at 19:35 UTC ( #247044=note: print w/replies, xml ) Need Help??

in reply to Re: Zipcode Proximity script

To add to this: If you don't really care about great circle distance, and you can get away with flat-earth distances, you could start by eliminating all points that are outside the smallest box that fits around your circle. This will eliminate most of the data in two passes. (Outside Lat bounds, and outside Long bounds.) If you store the master data in a SQL database with a couple of indexes, you could just do a query to get the starting set, then trim it with the circle algorighm you already have.

The advantage this has over blokhead's method is that it will work correctly regardless of circle size, and eliminate more points, in exchange for four extra calculations (N, S, E, W bounds). (Ten degrees is a lot of land.)

You might also want to consider storing the points in a database so that a SQL Query on a couple of indexes can do most of the data elimination for you in one pass.

Also, if you multiply the Lat/Longs by 10,000, you can store and manipulate them as longs instead of singles. (This alone might be enough to solve your performance problem.)

Just a quick stab at some SQL for this: (It assumes you've already calculated the bounding box.)
```SELECT zip FROM zip_lat_long
WHERE lat > \$south_border
AND lat < \$north_border
AND long > \$east_border
AND long < \$west_border
AND \$max_distance ** 2 >
(
ABS( lat - \$center_lat ) ** 2
+
ABS( long - \$center_long ) ** 2
);
(With luck an optimizer will index seek the first four conditions before crunching the last one.)

This is a neat problem, I wish I had time to bang out some sample code.
--
Spring: Forces, Coiled Again!

Create A New User
Node Status?
node history
Node Type: note [id://247044]
help
Chatterbox?
 [1nickt]: Corion this looks good, from the pod: "there are 9000+ variations that are detected correctly in the test files (see t/data/* for most of them). If you can think of any that I do not cover, please let me know." [TCLion]: some moron put the date like this : Mon Feb 20 09:31:30 2017 [Corion]: 1nickt: Yes, the module sounds promising indeed [1nickt]: "putting the date in correct order" how? [Corion]: TCLion: Whee ;) [TCLion]: need to put like this : 2017-02-20 09:30:53 [1nickt]: That's why I asked if you are using DateTime. It has a large number of supporting modules (the author likes the term 'eco-system') so if you are already creating a DateTime obj from your dates, this module would read in the mnoron-formatted 1s seamlessly [TCLion]: when I put the date together it looks like : 2017-Feb-24 (month is the problem) [1nickt]: good luck, then. [TCLion]: looking at DateTime documentation in monastery now

How do I use this? | Other CB clients
Other Users?
Others having an uproarious good time at the Monastery: (12)
As of 2017-03-23 14:56 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
Should Pluto Get Its Planethood Back?

Results (288 votes). Check out past polls.