[RNFdev] Not a pretty picture
Dan Putler
putler at sauder.ubc.ca
Tue Sep 26 00:16:38 EDT 2006
Frank, it works as advertised. It also made me realize that the
needed scripting tools for this undertaking probably should be Python
rather than R focused since Python is more commonly used by folks in
the open source GIS community (as opposed to people who primarily do
statistics using spatial data).
Dan
On 25-Sep-06, at 5:22 PM, Dan Putler wrote:
> Thanks Frank, I'll give this a shot. I've got the most recent
> version installed on my Linux box. It turns out that the gaps
> between my hand created lines and other lines was done on purpose.
> The goal was to avoid having edges cross one another.
>
> Dan
>
> On 25-Sep-06, at 5:08 PM, Frank Warmerdam wrote:
>
>> Dan Putler wrote:
>>> Hi Frank,
>>> I assume that a shapefile is a reasonable format. To that end,
>>> I've attached the shapefile with the boundary linear features for
>>> the K2W postal code.
>>> The linear features (road segments) that are not ordered within
>>> the layer. Specifically, two adjoining road segments for the same
>>> street do not follow one another in the original StatsCan RNF.
>>> They are, in fact, randomly ordered. Probably to make things
>>> render in a more attractive fashion. However, the first point of
>>> one road segment is the same as the last point of the preceding
>>> road segment for that street (road segments run intersection to
>>> intersection). I did not use this information in my script (which
>>> simply grabs the vertices of the line features), but I can see
>>> that it could be used order the road segments. Where things break
>>> down is for linear features that I have digitalized. They
>>> represent non-road boundaries that are not in the RNF itself.
>>> These features can be identified since they have a NAME attribute
>>> of "Fill", and have a value for the RD_SEG field that is greater
>>> than 3000.
>>
>> Dan,
>>
>> I have attached a script, mkpoly.py, which uses OGR to assemble
>> the polygon.
>> I see there are gaps between some of your line endings (likely the
>> manually
>> created ones?) so I have turned on some tolerances when assembling.
>>
>> If you install FWTools (http://fwtools.maptools.org) then from an
>> FWTools
>> shell you should be able to do something like:
>>
>> python mkpoly.py K2W.shp K2W_poly.shp
>>
>> It works ok for the dataset you sent, but we may need to fiddle
>> with it
>> a bit for other cases. We might also want to append the new
>> polygon to
>> an existing master file with the FSA as an attribute. All easily
>> done
>> if the geometry assembly works adequately.
>>
>> Let me know if it works for you.
>>
>> Best regards,
>> --
>> ---------------------------------------
>> +--------------------------------------
>> I set the clouds in motion - turn up | Frank Warmerdam,
>> warmerdam at pobox.com
>> light and sound - activate the windows | http://pobox.com/~warmerdam
>> and watch the world go round - Rush | President OSGeo, http://
>> osgeo.org
>>
>> #!/usr/bin/env python
>> #********************************************************************
>> **********
>> # $Id: gdalchksum.py,v 1.3 2005/02/23 14:37:03 fwarmerdam Exp $
>> #
>> # Project: GDAL
>> # Purpose: Merge a bunch of linestrings in into a single polygon.
>> # Author: Frank Warmerdam, warmerdam at pobox.com
>> #
>> #********************************************************************
>> **********
>> # Copyright (c) 2006, Frank Warmerdam <warmerdam at pobox.com>
>> #
>> # Permission is hereby granted, free of charge, to any person
>> obtaining a
>> # copy of this software and associated documentation files (the
>> "Software"),
>> # to deal in the Software without restriction, including without
>> limitation
>> # the rights to use, copy, modify, merge, publish, distribute,
>> sublicense,
>> # and/or sell copies of the Software, and to permit persons to
>> whom the
>> # Software is furnished to do so, subject to the following
>> conditions:
>> #
>> # The above copyright notice and this permission notice shall be
>> included
>> # in all copies or substantial portions of the Software.
>> #
>> # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
>> EXPRESS
>> # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
>> MERCHANTABILITY,
>> # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
>> EVENT SHALL
>> # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
>> DAMAGES OR OTHER
>> # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
>> ARISING
>> # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
>> OTHER
>> # DEALINGS IN THE SOFTWARE.
>> #********************************************************************
>> **********
>> #
>>
>> import gdal
>> import ogr
>> import osr
>> import sys
>>
>> def Usage():
>> print 'Usage: mkpoly.py srcfile dstfile'
>> sys.exit(1)
>>
>> #
>> =====================================================================
>> ========
>> # Mainline
>> #
>> =====================================================================
>> ========
>>
>> srcfile = None
>> dstfile = None
>>
>> gdal.AllRegister()
>> argv = gdal.GeneralCmdLineProcessor( sys.argv )
>> if argv is None:
>> sys.exit( 0 )
>>
>> # Parse command line arguments.
>> i = 1
>> while i < len(argv):
>> arg = argv[i]
>>
>> if srcfile is None:
>> srcfile = arg
>> elif dstfile is None:
>> dstfile = arg
>> else:
>> print 'unknown option: ', arg
>> Usage()
>>
>> i = i+1
>>
>> if dstfile is None:
>> Usage()
>>
>> #
>> ---------------------------------------------------------------------
>> -------
>> # Read all the source linestrings.
>> #
>> ---------------------------------------------------------------------
>> -------
>>
>> src_ds = ogr.Open( srcfile )
>> src_layer = src_ds.GetLayer(0)
>>
>> collection = ogr.Geometry( type = ogr.wkbGeometryCollection )
>>
>> feat = src_layer.GetNextFeature()
>> while feat is not None:
>>
>> collection.AddGeometry( feat.GetGeometryRef() )
>>
>> feat.Destroy()
>> feat = src_layer.GetNextFeature()
>>
>> print 'Got %d lines.' % collection.GetGeometryCount()
>>
>> #
>> ---------------------------------------------------------------------
>> -------
>> # Assemble into a polygon.
>> #
>> ---------------------------------------------------------------------
>> -------
>>
>> try:
>> poly = ogr.BuildPolygonFromEdges( collection, Tolerance=0.001,
>> bAutoClose=1, bBestEffort=1 )
>> print poly.ExportToWkt()
>> except:
>> print 'BuildPolygonFromEdges failed.'
>>
>> #
>> ---------------------------------------------------------------------
>> -------
>> # Save results to new file.
>> #
>> ---------------------------------------------------------------------
>> -------
>>
>> nad83 = osr.SpatialReference()
>> nad83.SetFromUserInput('NAD83')
>>
>> shp_driver = ogr.GetDriverByName( 'ESRI Shapefile' )
>> shp_driver.DeleteDataSource( dstfile )
>>
>> shp_ds = shp_driver.CreateDataSource( dstfile )
>>
>> shp_layer = shp_ds.CreateLayer( 'out', geom_type = ogr.wkbPolygon,
>> srs = nad83 )
>>
>> out_feat = ogr.Feature(feature_def = shp_layer.GetLayerDefn() )
>> out_feat.SetGeometry( poly )
>>
>> shp_layer.CreateFeature( out_feat )
>>
>> out_feat.Destroy()
>>
>> shp_layer = None
>> shp_ds.Destroy()
>>
>
More information about the Can_rnf
mailing list