Problem with adding Attributes to a point shapefile

2 messages Options
Embed this post
Permalink
AmandaH

Problem with adding Attributes to a point shapefile

Reply Threaded More More options
Print post
Permalink
Hello-

I'm trying to create a point shapefile of all the first points in the polygons (from a poly shapefile) as shown below.  I also want to assign some attributes to the different point features.  I am having some issues doing this.  I get an error on the "feaPt.SetField("LAND_USE", sLandUse)" line that says "AccessViolationException was unhandled Attempted to read or write protected memory.  This is often an indication that other memory is corrupt".

If I take the attribute stuff out it runs fine and creates the shapefile.  I've done attribute adding before and this way has always worked for me, any ideas what I'm doing wrong???

      public void BuildShapefile(string sPolyShapeFile)
      {
         Ogr.RegisterAll();

         // Get driver for the shapefiles
         Driver drvShpFile = Ogr.GetDriverByName("ESRI Shapefile");

         // Create a Spatial Reference
         OSGeo.OSR.SpatialReference srGeo = new OSGeo.OSR.SpatialReference("");
         srGeo.SetGeogCS("Geographic Coordinate System", OSGeo.OSR.Osr.SRS_DN_WGS84, OSGeo.OSR.Osr.SRS_DN_WGS84, OSGeo.OSR.Osr.SRS_WGS84_SEMIMAJOR, OSGeo.OSR.Osr.SRS_WGS84_INVFLATTENING, "Greenwich", 0.0, "degree", 0.0174532925199433);

         // Create a datasource for the polygon file and for the new point file
         DataSource dsPolyShpFile = Ogr.Open(sPolyShapeFile, 0);
         DataSource dsPtShpFile = drvShpFile.CreateDataSource("D:\\Vector\\Output", new string[] { });

         // Create layers for the polygon file and the point file
         Layer lyrPoly = dsPolyShpFile.GetLayerByIndex(0);
         Layer lyrPt = dsPtShpFile.CreateLayer("Junk", srGeo, wkbGeometryType.wkbPoint, new string[] { });

         // Create Field Definition, Feature Definition and Features to enable us writing attributes to the new shapefile

         FeatureDefn feadefPt = lyrPt.GetLayerDefn();

         Feature feaPt = new Feature(feadefPt);
         Feature feaPoly;

         FieldDefn flddefLandUse = new FieldDefn("LAND_USE", FieldType.OFTString);

         flddefLandUse.SetWidth(100);

         //// Create an attribute field
         lyrPt.CreateField(flddefLandUse, 0);

         flddefLandUse.Dispose();

         // Create the Geometry for the new point file
         Geometry geoPoint = new Geometry(wkbGeometryType.wkbPoint);

         Geometry geoPoly = new Geometry(wkbGeometryType.wkbPolygon);
         Geometry geoPolyRing = new Geometry(wkbGeometryType.wkbLinearRing);

         int iFeaCount = lyrPoly.GetFeatureCount(1);

         // Loop through the poly file to get the points
         for (int iFea = 0; iFea < iFeaCount; iFea++)
         {
            feaPoly = lyrPoly.GetFeature(iFea);
            string sLandUse = feaPoly.GetFieldAsString("PGLANDUSE");
            geoPoly = feaPoly.GetGeometryRef();
            geoPolyRing = geoPoly.GetGeometryRef(0);

            // Add a point
            geoPoint.AddPoint(geoPolyRing.GetX(0), geoPolyRing.GetY(0), 0.0);
            feaPt.SetGeometry(geoPoint);

            // Set the attribute
            feaPt.SetField("LAND_USE", sLandUse);

            lyrPt.CreateFeature(feaPt);

            geoPoint.Empty();

            if (iFea == (iFeaCount - 1))
               feaPoly.Dispose();
         }
         geoPolyRing.Dispose();
         geoPoly.Dispose();
         geoPoint.Dispose();
         feaPt.Dispose();
         feadefPt.Dispose();
         lyrPoly.Dispose();
         lyrPt.Dispose();
         dsPolyShpFile.Dispose();
         dsPtShpFile.Dispose();
         srGeo.Dispose();
         drvShpFile.Dispose();
      }

Thanks,
Amanda M. Henneke




When One tugs at a single thing in Nature, he finds it attached to the rest of the world. -John Muir
  Please consider the environment before printing this e-mail.


_______________________________________________
gdal-dev mailing list
[hidden email]
http://lists.osgeo.org/mailman/listinfo/gdal-dev
Even Rouault

Re: Problem with adding Attributes to a point shapefile

Reply Threaded More More options
Print post
Permalink
Selon "Henneke, Amanda M" <[hidden email]>:

Amanda,

The fundamental reason is a call ordering problem. You currently do :

FeatureDefn feadefPt = lyrPt.GetLayerDefn();
Feature feaPt = new Feature(feadefPt);
lyrPt.CreateField(flddefLandUse, 0);

which is wrong as you change the feature definition after having instanciated a
feature. When you instanciate a feature, the feature definition must not change
after (arrays are created with the number of fields of the definition, so layer
the SetField() call will try to set an out-of-bound element). So the fix is to
simply move the feature instanciation after the CreateField() call

Best regards,

Even

> Hello-
>
> I'm trying to create a point shapefile of all the first points in the
> polygons (from a poly shapefile) as shown below.  I also want to assign some
> attributes to the different point features.  I am having some issues doing
> this.  I get an error on the "feaPt.SetField("LAND_USE", sLandUse)" line that
> says "AccessViolationException was unhandled Attempted to read or write
> protected memory.  This is often an indication that other memory is corrupt".
>
> If I take the attribute stuff out it runs fine and creates the shapefile.
> I've done attribute adding before and this way has always worked for me, any
> ideas what I'm doing wrong???
>
>       public void BuildShapefile(string sPolyShapeFile)
>       {
>          Ogr.RegisterAll();
>
>          // Get driver for the shapefiles
>          Driver drvShpFile = Ogr.GetDriverByName("ESRI Shapefile");
>
>          // Create a Spatial Reference
>          OSGeo.OSR.SpatialReference srGeo = new
> OSGeo.OSR.SpatialReference("");
>          srGeo.SetGeogCS("Geographic Coordinate System",
> OSGeo.OSR.Osr.SRS_DN_WGS84, OSGeo.OSR.Osr.SRS_DN_WGS84,
> OSGeo.OSR.Osr.SRS_WGS84_SEMIMAJOR, OSGeo.OSR.Osr.SRS_WGS84_INVFLATTENING,
> "Greenwich", 0.0, "degree", 0.0174532925199433);
>
>          // Create a datasource for the polygon file and for the new point
> file
>          DataSource dsPolyShpFile = Ogr.Open(sPolyShapeFile, 0);
>          DataSource dsPtShpFile =
> drvShpFile.CreateDataSource("D:\\Vector\\Output", new string[] { });
>
>          // Create layers for the polygon file and the point file
>          Layer lyrPoly = dsPolyShpFile.GetLayerByIndex(0);
>          Layer lyrPt = dsPtShpFile.CreateLayer("Junk", srGeo,
> wkbGeometryType.wkbPoint, new string[] { });
>
>          // Create Field Definition, Feature Definition and Features to
> enable us writing attributes to the new shapefile
>
>          FeatureDefn feadefPt = lyrPt.GetLayerDefn();
>
>          Feature feaPt = new Feature(feadefPt);
>          Feature feaPoly;
>
>          FieldDefn flddefLandUse = new FieldDefn("LAND_USE",
> FieldType.OFTString);
>
>          flddefLandUse.SetWidth(100);
>
>          //// Create an attribute field
>          lyrPt.CreateField(flddefLandUse, 0);
>
>          flddefLandUse.Dispose();
>
>          // Create the Geometry for the new point file
>          Geometry geoPoint = new Geometry(wkbGeometryType.wkbPoint);
>
>          Geometry geoPoly = new Geometry(wkbGeometryType.wkbPolygon);
>          Geometry geoPolyRing = new Geometry(wkbGeometryType.wkbLinearRing);
>
>          int iFeaCount = lyrPoly.GetFeatureCount(1);
>
>          // Loop through the poly file to get the points
>          for (int iFea = 0; iFea < iFeaCount; iFea++)
>          {
>             feaPoly = lyrPoly.GetFeature(iFea);
>             string sLandUse = feaPoly.GetFieldAsString("PGLANDUSE");
>             geoPoly = feaPoly.GetGeometryRef();
>             geoPolyRing = geoPoly.GetGeometryRef(0);
>
>             // Add a point
>             geoPoint.AddPoint(geoPolyRing.GetX(0), geoPolyRing.GetY(0), 0.0);
>             feaPt.SetGeometry(geoPoint);
>
>             // Set the attribute
>             feaPt.SetField("LAND_USE", sLandUse);
>
>             lyrPt.CreateFeature(feaPt);
>
>             geoPoint.Empty();
>
>             if (iFea == (iFeaCount - 1))
>                feaPoly.Dispose();
>          }
>          geoPolyRing.Dispose();
>          geoPoly.Dispose();
>          geoPoint.Dispose();
>          feaPt.Dispose();
>          feadefPt.Dispose();
>          lyrPoly.Dispose();
>          lyrPt.Dispose();
>          dsPolyShpFile.Dispose();
>          dsPtShpFile.Dispose();
>          srGeo.Dispose();
>          drvShpFile.Dispose();
>       }
>
> Thanks,
> Amanda M. Henneke
>
>
>
>
> When One tugs at a single thing in Nature, he finds it attached to the rest
> of the world. -John Muir
>   Please consider the environment before printing this e-mail.
>
>
> _______________________________________________
> gdal-dev mailing list
> [hidden email]
> http://lists.osgeo.org/mailman/listinfo/gdal-dev
>


_______________________________________________
gdal-dev mailing list
[hidden email]
http://lists.osgeo.org/mailman/listinfo/gdal-dev