Thanks Andy for thinking about this for me.

I tried using that function, but get this error:

gc3=# SELECT
gc3-# ST_AsText(the_geom) as street, strunamefr, l_adddirfg, l_hnumf, l_hnuml, 
l_stname_c, l_placenam, r_adddirfg, r_hnumf, r_hnuml, r_stname_c, r_placenam,
gc3-# ST_Distance(ST_GeomFromText('POINT(-79.639711 
43.8098590)',4326),the_geom) AS distance,
gc3-# ST_line_locate_point(the_geom, ST_GeomFromText('POINT(-79.639711 
43.8098590)')) As street_num
gc3-# FROM province_on
gc3-# WHERE the_geom && SetSRID('BOX3D(-79.64991853 43.80470025,-79.63089798 
43.81621783)'::box3d,4326) ORDER BY distance ASC LIMIT 1;
ERROR:  line_locate_point: 1st arg isnt a line
gc3=# 

So I'm using PostGIS 1.5.3, and the docs 
(http://postgis.refractions.net/docs/ST_Line_Locate_Point.html) say that 
multilinestrings are supported, so…. ???


On 2011-10-12, at 6:31 PM, Andy Colson wrote:

> On 10/12/2011 06:38 PM, Andy Colson wrote:
>> On 10/12/2011 06:29 PM, Andy Colson wrote:
>>> On 10/12/2011 01:01 PM, René Fournier wrote:
>>>> Hi,
>>>> 
>>>> I'm developing a reverse-geocoder for Canada. So far, given a lat/lng, I 
>>>> can find the nearest street (line segment), which includes line segment 
>>>> direction and address ranges for both sides of the street. I'm now trying 
>>>> to figure out the best way to programmatically approximate the nearest 
>>>> house number to the given lat/lng point.
>>>> 
>>>> Here's an example of a row containing the street data:
>>>> 
>>>> -[ RECORD 1 ]-
>>>> [...]
>>>> l_adddirfg | Same Direction
>>>> l_hnumf | 3219
>>>> l_hnuml | 3235
>>>> l_stname_c | Breen Road North-west
>>>> r_adddirfg | Same Direction
>>>> r_hnumf | 3224
>>>> r_hnuml | 3236
>>>> r_stname_c | Breen Road North-west
>>>> the_geom | 
>>>> 0105000020E610000001000000010200000002000000B0F6990E78885CC088DF2B5F3C8C49400875B39A89885CC0A0BCA6AC4B8C4940
>>>> 
>>>> 
>>>> So, given a lat/lng coordinate that lies near the "the_geom" line segment, 
>>>> a person could tell visually which side of the street the point is on 
>>>> (left or right side), and how far along the segment it is -- thereby 
>>>> approximating a house number. For example, if the point lies on the right 
>>>> side, three-quarters down the street, I would use the fields r_hnumf 
>>>> (right side, first number) and r_hnuml (right side, last number)... The 
>>>> street address is probably close to:
>>>> 
>>>> 3232 Breen Road North-west
>>>> 
>>>> What I'm looking for is a best practice in either computing/approximating 
>>>> this in PostGIS (which I'm new to), or in the application layer once the 
>>>> row is fetched.
>>>> 
>>>> Any ideas? Thanks!
>>>> 
>>>> ...Rene
>>>> 
>>>> 
>>>> 
>>> Is this the only format you have the data in? If you had two rectangles 
>>> (one for each side of the street), and each rect had an address, this would 
>>> be a lot simpler. Is that geom a line? rectangle? Do you have a layer that 
>>> has lots or parcels?
>>> 
>>> -Andy
>>> 
>>> 
>>> 
>> 
>> Ah, its a line:
>> MULTILINESTRING((-114.1323277 51.0955924,-114.1333987 51.0960594000001))
>> 
>> But then you have a problem. If this is a street line, and its going 
>> north/south, great, but what if its going east/west? What's the right hand 
>> side of a horizontal line?
>> 
>> -Andy
>> 
>> 
> 
> Wow.  Neet.  I Learned something new.  PostGIS never ceases to amaze me.
> 
> Find the point on a line closest to a click point:
> 
> http://postgis.refractions.net/docs/ST_Line_Locate_Point.html
> 
> 
> Then use  
> http://postgis.refractions.net/documentation/manual-svn/ST_Azimuth.html to 
> find the angle between two points.
> 
> The angle can tell you if the click point is left/right (or above/below) the 
> street.
> 
> I googled two things that might offer you more help: "postgis line direction" 
> and "postgis point closest to line".
> 
> Ok, I'll quit spamming the list now.  (Oh yeah, I have some med's I can sell 
> ya!)
> 
> -Andy
> 

Reply via email to