[postgis-users] Extracting the Linestring Geometry from a BBox(noob)

Emily Gouge egouge at refractions.net
Mon Nov 27 17:13:28 PST 2006


Try it.

This simple example shows that the intersection of a polygon and linestring returns a linestring.

select astext(intersection(geomfromtext('POLYGON((1 1, 1 2, 2 2, 2 1, 1 1))'), 
geomfromtext('LINESTRING(0 0, 3 3)')));

Returns:
  LINESTRING(1 1,2 2)



Andrew Hughes wrote:
> Hi Emily,
> 
> Thanks for that! Unless I am mistaken......
> 
> I think I am working out that the intersection function returns the points at 
> which the two geometry's intersect. This is the points at which my LINESTRING 
> enters and exits the BBox (hence the MULTIPOINT). So I don't think that this 
> really does what I want.
> 
>  >From : http://postgis.refractions.net/docs/ch06.html#id2526581
> 
>     Intersection(geometry, geometry)
> 
>         Returns a geometry that represents the point set intersection of the
>         Geometies.
> 
>         Performed by the GEOS module
> 
>         Do not call with a GeometryCollection as an argument
> 
>         OGC SPEC s2.1.1.3
> 
> 
> I am not sure anything does what I am looking for, maybe someone else knows???
> 
> 
> --Thanks Heaps Though!
> 
> 
> 
> 
> Emily Gouge wrote:
>> Try the intersection function in the select statement.  Something like:
>>
>> select intersection(the_geom, setsrid('BOX3D(138.4925 -34.905393,138.493313 
>> -34.90458)', 4283))
>> from route_service_transaction where intersects(the_geom, 
>> SetSRID('BOX3D(138.4925 -34.905393,138.493313 -34.90458)'::box3d,4283))
>>
>> Andrew Hughes wrote:
>>> Hi Pedro,
>>>
>>> Thanks for the reply!!!!!
>>>
>>> I'm finding some problems with my query (specifically the "intersection" 
>>> function).... I can select the entire LINESTRING that intersects a BBox.... 
>>> but  I can not limit the geometry of that LINESTRING to the path through the 
>>> BBox (like in the images below).
>>>
>>> My Query to Find the entire LINESTRING(s) is:
>>>
>>>     select the_geom  from route_service_transaction where intersects(the_geom,
>>>     SetSRID('BOX3D(138.4925 -34.905393,138.493313 -34.90458)'::box3d,4283))
>>>
>>>     This does sucessfully find the LINESTRINGs I am looking for, however they
>>>     return the Complete LINESTRING inside AND outside the bbox. I only want the
>>>     LINESTRING(s) that are inside the BBox.
>>>
>>>     Returns:
>>>     SRID=4283;LINESTRING(138.49680675 -34.89338892,138.496643
>>>     -34.8935516,138.496643 -34.8935516,138.496882 -34.893792,138.496882
>>>     -34.893792,138.496773 -34.893837,138.496186 -34.894212,138.496186
>>>     -34.894212,138.495597 -34.894607,138.495475 -34.894711,138.495422
>>>     -34.894779,138.495422 -34.894779,138.495369 -34.894848,138.495301
>>>     -34.894999,138.49529 -34.895088,138.49529 -34.895088,138.495277
>>>     -34.895194,138.495291 -34.895815,138.495291 -34.895815,138.494732
>>>     -34.895772,138.494732 -34.895772,138.494418 -34.895756,138.494418
>>>     -34.895756,138.494421 -34.895791,138.494368 -34.896227,138.49427
>>>     -34.896491,138.494183 -34.89665,138.493852 -34.897041,138.493775
>>>     -34.897091,138.493775 -34.897091,138.493586 -34.89721,138.493344
>>>     -34.897282,138.493127 -34.897301,138.493127 -34.897301,138.492088
>>>     -34.897342,138.492088 -34.897342,138.492174 -34.898481,138.492174
>>>     -34.898481,138.492178 -34.898537,138.492219 -34.899098,138.492219
>>>     -34.899098,138.492252 -34.899601,138.492252 -34.899601,138.492261
>>>     -34.899752,138.492261 -34.899752,138.492303 -34.900254,138.492303
>>>     -34.900254,138.492415 -34.901815,138.492415 -34.901815,138.492439
>>>     -34.902282,138.492439 -34.902282,138.492453 -34.902282,138.492472
>>>     -34.902285,138.492489 -34.902291,138.492505 -34.902301,138.492518
>>>     -34.902312,138.492527 -34.902326,138.492533 -34.902341,138.492534
>>>     -34.902353,138.492534 -34.902353,138.492535 -34.902357,138.492533
>>>     -34.902373,138.492527 -34.902388,138.492518 -34.902402,138.492505
>>>     -34.902413,138.492489 -34.902423,138.492472 -34.902429,138.492453
>>>     -34.902432,138.492448 -34.902432,138.492448 -34.902432,138.492631
>>>     -34.904971,138.492631 -34.904971,138.492646 -34.904971,138.492666
>>>     -34.904974,138.492685 -34.904981,138.492701 -34.904991,138.492715
>>>     -34.905003,138.492725 -34.905018,138.492731 -34.905033,138.492732
>>>     -34.905044,138.492732 -34.905044,138.492733 -34.90505,138.492731
>>>     -34.905067,138.492725 -34.905082,138.492715 -34.905097,138.492701
>>>     -34.905109,138.492685 -34.905119,138.492666 -34.905126,138.492646
>>>     -34.905129,138.492642 -34.905129,138.492642 -34.905129,138.4927512
>>>     -34.9065512,138.4927512 -34.9065512,138.49314358 -34.90652109)
>>>
>>> I have tried to limit the above LINESTRING to the geometry with the following 
>>> query:
>>>
>>>     select intersection(
>>>       (select the_geom  from route_service_transaction where
>>>     intersects(the_geom, SetSRID('BOX3D(138.4925   -34.905393,138.493313
>>>     -34.90458)'::box3d,4283)) )
>>>       ,
>>>       (SetSRID('BOX3D(138.4925 -34.905393,138.493313 -34.90458)'::box3d,4283))
>>>     )
>>>
>>>     However this returns something very strange - ???MULIPOINT??? and :
>>>     Returns:
>>>     SRID=4283;MULTIPOINT(138.492602818432 -34.90458 1.7e-308,138.492662270567
>>>     -34.905393 1.7e-308)
>>>
>>>
>>> Any idea how to "trim" or "limit" the LINESTRING in the first query to that 
>>> of the path through a BBox??? Also, maintaining this as a LINESTRING not a 
>>> multipoint.
>>>
>>>
>>>
>>> Many Thanks!!!!
>>>
>>>
>>>
>>> p.s. sorry if these questions are annoying, I am rather new to PostGIS!
>>>
>>>
>>>
>>>
>>> Pedro Doria Meunier wrote:
>>>>
>>>> Hey Andrew,
>>>>
>>>>  
>>>>
>>>> I had to do a similiar thing…
>>>>
>>>> “Cut” the road segments belonging to a municipality… and the query ended 
>>>> like this:
>>>>
>>>>  
>>>>
>>>> create my_road_segment as
>>>>
>>>> select intersection(r.geometry, f.geometry) as geometry,
>>>>
>>>> r.name, r.sec_name, r.city, r.region, r.country, r.pcode, r.road_type,
>>>>
>>>> r.route_class, r.speed_class, r.one_way, r.has_dir, r.toll, r.no_car,
>>>>
>>>> r.no_bus, r.no_taxi, r.no_bic, r.no_truck, r.no_emerg, r.no_deliv, 
>>>> r.no_pedes, r.classific
>>>>
>>>> from rede_estradas as r, freguesias_ram as f
>>>>
>>>> where r.geometry && f.geometry
>>>>
>>>> and intersects(r.geometry, f.geometry)
>>>>
>>>> and f.nome_freg like 'Fajã da Ovelha%';
>>>>
>>>>  
>>>>
>>>> the keyword here is INTERSECTS
>>>>
>>>>  
>>>>
>>>> This query creates a table based on a select. This select returns the road 
>>>> segments **contained** in a polygon defining a municipality.
>>>>
>>>>  
>>>>
>>>> Hope this helps.
>>>>
>>>>  
>>>>
>>>> _Pedro Doria Meunier_
>>>>
>>>> (351) 91 302 49 72 - (351) 96 247 99 12
>>>>
>>>> MSN - pdoriam at hotmail.com <mailto:pdoriam at hotmail.com>
>>>>
>>>> ICQ - 308-182-126
>>>>
>>>> Skype: pdoriam
>>>>
>>>>  
>>>>
>>>> -------------------------------------------------------------------------------- 
>>>>
>>>>
>>>> *From:* postgis-users-bounces at postgis.refractions.net 
>>>> [mailto:postgis-users-bounces at postgis.refractions.net] *On Behalf Of *Andrew 
>>>> Hughes
>>>> *Sent:* segunda-feira, 27 de Novembro de 2006 7:22
>>>> *To:* postgis-users at postgis.refractions.net
>>>> *Subject:* [postgis-users] Extracting the Linestring Geometry from a BBox(noob)
>>>>
>>>>  
>>>>
>>>> Hey All,
>>>>
>>>> I'm trying to extract some linestrings from a collection of linestrings  and 
>>>> conditional on being within a BBox.
>>>>
>>>> I will try and explain this best with some images...
>>>>
>>>> My input looks like:
>>>>
>>>>
>>>>
>>>> My desired output looks like this:
>>>>
>>>> (note that I DO want the point where it intersects the bbox)
>>>>
>>>>
>>>>
>>>> Is this at all possible to do? or do I need to start writing my own postgis 
>>>> fuctions???
>>>>
>>>>
>>>>
>>>> Thanks  in advance
>>>>
>>>> --AH
>>>>
>>>> -------------------------------------------------------------------------------- 
>>>>
>>>>
>>>> _______________________________________________
>>>> postgis-users mailing list
>>>> postgis-users at postgis.refractions.net
>>>> http://postgis.refractions.net/mailman/listinfo/postgis-users
>>>>   
>>>
>>>
>>> -- 
>>>
>>> Regards,
>>>
>>> *Andrew Hughes*
>>> Software Engineer
>>> LISAsoft Pty. Ltd. (Adelaide)
>>>
>>> --------------------------------------------------------------------------------
>>>
>>>
>>>       LISAsoft Pty. Ltd.
>>>
>>> <http://www.lisasoft.com>
>>> *ADELAIDE Office*
>>> <http://terrapages.net/mapbutton/RetrieveButtonServlet?buttonID=4>
>>> 38 Greenhill Road
>>> Wayville SA 5034
>>> Australia
>>> *Telephone +61 8 8272 1555*
>>> *Facsimile +61 8 8271 1199*    
>>>     *SYDNEY Office*
>>> <http://terrapages.net/mapbutton/RetrieveButtonServlet?buttonID=1>
>>> Suite 112 The Lower Deck
>>> Jones Bay Wharf
>>> 19-21 Pirrama Road
>>> Pyrmont NSW 2009 AUS
>>> *Telephone +61 2 8570 5060*
>>> *Facsimile +61 2 8570 5099*    
>>>     *MELBOURNE Office*
>>> <http://terrapages.net/mapbutton/RetrieveButtonServlet?buttonID=3>
>>> Level 7 520 Collins Street
>>> Melbourne VIC 3000
>>> Australia
>>> *Telephone +61 3 9629 1799*
>>> *Facsimile +61 3 9629 4955*
>>>
>>> --------------------------------------------------------------------------------
>>>
>>>
>>> ------------------------------------------------------------------------
>>>
>>> _______________________________________________
>>> postgis-users mailing list
>>> postgis-users at postgis.refractions.net
>>> http://postgis.refractions.net/mailman/listinfo/postgis-users
>>
>> _______________________________________________
>> postgis-users mailing list
>> postgis-users at postgis.refractions.net
>> http://postgis.refractions.net/mailman/listinfo/postgis-users
>>
> 
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> postgis-users mailing list
> postgis-users at postgis.refractions.net
> http://postgis.refractions.net/mailman/listinfo/postgis-users




More information about the postgis-users mailing list