Here&#39;s a simple PERL geocoder for Google.<br><br>-- $Id: google_geocode.sql 171 2007-01-26 02:35:09Z mark $ --<br><br>DROP TABLE google_api_key;<br><br>CREATE TABLE google_api_key (<br>&nbsp;&nbsp;&nbsp; key text primary key<br>);<br>
<br>INSERT INTO google_api_key values (&#39;your key here&#39;);<br><br>CREATE OR REPLACE FUNCTION geocode(text) returns geometry as $$<br>declare<br>&nbsp;&nbsp;&nbsp; mykey text;<br>begin<br>&nbsp;&nbsp;&nbsp; select key into mykey from google_api_key;
<br>&nbsp;&nbsp;&nbsp; return GeomFromEWKT(geocode_impl($1, mykey));<br>end;<br>$$ language plpgsql;<br><br>CREATE OR REPLACE FUNCTION geocode_impl(text, text) returns text as &#39;<br>&nbsp;&nbsp; use LWP::Simple;<br>&nbsp;&nbsp; $csv = get(&quot;<a href="http://maps.google.com/maps/geo?output=csv&amp;q=">
http://maps.google.com/maps/geo?output=csv&amp;q=</a>&quot;.$_[0].&quot;&amp;key=&quot;.$_[1]);<br>&nbsp;&nbsp; @tokens = split(/,/, $csv);<br>&nbsp;&nbsp; if ($tokens[0] == &quot;200&quot;) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return &quot;SRID=4326;POINT(&quot; . $tokens[3] . &quot; &quot; . $tokens[2] . &quot;)&quot;;
<br>&nbsp;&nbsp; } else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return &quot;&quot;;<br>&nbsp;&nbsp; }<br>&#39; LANGUAGE plperlu IMMUTABLE;<br><br>google uses tmerc, so you can call a function like this to get correct SRID for point and use transform<br><br>create or replace function getUTMZoneEPSG(geometry) returns int as $$
<br>declare<br>&nbsp;&nbsp;&nbsp; i int := 32600;<br>&nbsp;&nbsp;&nbsp; j numeric;<br>begin<br>&nbsp;&nbsp;&nbsp; j := abs((-180 - X($1)) / 6);<br>&nbsp;&nbsp;&nbsp; if j &lt; 0.5 then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j := 1;<br>&nbsp;&nbsp;&nbsp; end if;<br>&nbsp;&nbsp;&nbsp; i := i + round(j);<br>&nbsp;&nbsp;&nbsp; if Y($1) &lt; 0 then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i := i + 30;
<br>&nbsp;&nbsp;&nbsp; end if;<br>&nbsp;&nbsp;&nbsp; return i;<br>end;<br>$$ language plpgsql;<br><br><br>