[Gdal-dev] OGR_csharp sample code

Milo van der Linden milo at 3dsite.nl
Fri Jun 1 04:16:02 EDT 2007


Hello,

I have added some of the source I am using in VB.net to do exactly as
what you are requesting. There are a couple of things you have to keep
in mind:
- Build enumerators that mimic the enumerators that are in the original
OGR dll's
- Be careful, base for featurecount are different for shape files or
mapinfo tab (the first starts at 0, the other at 1)

Let me be honest, I am not giving you the code in detail. Google Earth
content is core business for my own little company (3DSite,
http://www.3dsite.nl)

I have spent a lot of time getting it to what it is now, I am not
working for a boss beside this and nobody is funding my effort. Maybe
you can give me some insight on what you are going to use it for?
Perhaps we can partner in the business, Greece is not to far away from
the Netherlands and I am a great fan of Greece!


First, at the loading of my vb.net application I register all OGR file
types:

 'Register all filetypes for use with OGR
        OGR.ogr.RegisterAll()

I have a Class that holds the following objects:

Datasets Collection of type Dataset (selfmade class)

Dataset looks something like this:

Public Class Dataset
        Private _DataSource As OGR.DataSource
        Private _Driver As OGR.Driver
        Private _Name As String
        Private _Path As String
        Private _Extension As String
        Private _FileName As String
        Private _Layers As Layers
        Private _NameField As String
        Private _GroupField As String
        Private _SortField As String

where I turn all these private variables into public properties

Then I have 2 constructors in the dataset object:

        Public Sub New(ByVal name As String, ByVal path As String, ByVal
extension As String)
            _Name = name
            _Path = path
            _Extension = extension
            _FileName = _Path & "\" & _Name & _Extension
            _DataSource = OGR.ogr.Open(_FileName, 0)
            _Driver = _DataSource.GetDriver()

        End Sub
        Public Sub New(ByVal FileName As String)
            Dim j As Integer
            _Layers = New Layers
            _FileName = FileName
            _Path = System.IO.Path.GetDirectoryName(FileName)
            _Extension = System.IO.Path.GetExtension(FileName)
            _Name = System.IO.Path.GetFileNameWithoutExtension(FileName)
            _DataSource = OGR.ogr.Open(_FileName, 0)
            _Driver = _DataSource.GetDriver()
            For j = 0 To _DataSource.GetLayerCount - 1
                Dim lyr As New Layer(_DataSource.GetLayerByIndex(j))
                _Layers.Add(lyr)
            Next
        End Sub

The Layer object is an enhanced version of the OGR.Layer object:

Public Class Layer
        Private _fieldtable As DataTable = New DataTable("Fields")
        Private _sr As New OGR.SpatialReference("")
        Private _ogrLayer As OGR.Layer
        Private _name As String
        Private _def As OGR.FeatureDefn
        Private _FeatureCount As Integer
        Private _Type As Integer

The Layer Object also has an advanced constructor:

Public Sub New(ByVal lyr As OGR.Layer)

            ' Create DataColumns and set various properties.
            Dim fName As DataColumn = New DataColumn
            fName.DataType = System.Type.GetType("System.String")
            fName.AllowDBNull = True
            fName.Caption = "Name"
            fName.ColumnName = "name"
            fName.DefaultValue = ""
            ' Add the column to the table.
            _fieldtable.Columns.Add(fName)

            Dim fNum As DataColumn = New DataColumn
            fNum.DataType = System.Type.GetType("System.String")
            fNum.AllowDBNull = True
            fNum.Caption = "Type"
            fNum.ColumnName = "type"
            fNum.DefaultValue = 0
            ' Add the column to the table.
            _fieldtable.Columns.Add(fNum)

            Dim tmp As String = ""
            _ogrLayer = lyr

            _def = _ogrLayer.GetLayerDefn()
            _name = _def.GetName
            _FeatureCount = _ogrLayer.GetFeatureCount(1)
            _Type = _def.GetGeomType
            Dim i As Integer
            For i = 0 To _def.GetFieldCount() - 1
                Dim row As DataRow
                row = _fieldtable.NewRow()
                Dim FieldDef As OGR.FieldDefn = _def.GetFieldDefn(i)
                row("name") = FieldDef.GetName
                row("type") = FieldDef.GetFieldType
                _fieldtable.Rows.Add(row)
            Next
            _sr = _ogrLayer.GetSpatialRef
            _sr.ExportToProj4(tmp)
            If tmp = "" Then
                Dim ATproj4 As String = "+proj=tmerc +lat_0=12.51697
+lon_0=-69.994775 +k=0.9996 +x_0=10000 +y_0=15000 +towgs84=0,0,0,0,0,0,0
+units=m +no_defs"
                '    'Pop up a dialog stating that the source projection
is invalid!
                '    '"No Source coordinate system defined, proceed?"
                _sr.ImportFromProj4(ATproj4)
            Else
                Debug.Print("Source coordinate system: " & tmp)
            End If
        End Sub

Then, for the conversion to KML, I loop through this Dataset-Layer object
Dim lyr As ClassData.Layer
            For Each lyr In _ds.Layers
                count = lyr.Count
                 For j = i To count
                    Dim feat As OGR.Feature = lyr.Feature(j)
                    If Not feat Is Nothing Then
                        Dim geom As OGR.Geometry = feat.GetGeometryRef
                        If Not geom Is Nothing Then
                            Dim geomType As wkbGeometryType
                            geomType = geom.GetGeometryType
                            If geomType = wkbGeometryType.wkbLineString
Or geomType = wkbGeometryType.wkbPolygon Or geomType =
wkbGeometryType.wkbPoint Or geomType = wkbGeometryType.wkbMultiPolygon Then
                                ..... Now you have reached the point
where you have a valid object!, use it to convert to a kml string


            Next

IMPORTANT:

If you are using non US system settings: You can use this code to make
sure comma's are interpreted correctly:

Sub DoTheThing
    'First, store the CurrentCulture so it can be reset after the
routine is done
            Dim originalCulture As System.Globalization.CultureInfo
            originalCulture = CultureInfo.CurrentCulture

            'Google Earth needs the locale to be set to US so the . and
, are interpreted correctly
            Thread.CurrentThread.CurrentCulture = New
CultureInfo("en-US", True)

                DoTheConversionHere

            'Reset the CurrentCulture
            Thread.CurrentThread.CurrentCulture = originalCulture
end sub


Kind regards,

Milo van der Linden

3DSite - Milo van der Linden - CTO
Groenedijk 12, 4441 TJ  Ovezande (Zeeland, Nederland)
milo at 3dsite.nl <mailto:milo at 3dsite.nl>
http://www.3dsite.nl


<skype:milovanderlinden?chat>
 


De informatie verzonden met dit e-mail bericht is uitsluitend bestemd
voor de geadresseerde(n). Gebruik van deze informatie door andere dan de
geadresseerde(n) is verboden. Openbaarmaking, vermenigvuldiging,
verspreiding en/of verstrekking van deze informatie aan derde is niet
toegestaan. Kopiëren en/of misbruiken van ingesloten afbeeldingen en/of
bestanden is wettelijke verboden en strafbaar. 3DSite staat niet in voor
de juiste en volledige overbrenging van de inhoud van een verzonden
e-mail, noch voor tijdig ontvangst daarvan. Op al onze leveringen,
aanbiedingen en verkopen zijn van toepassing onze Algemene Voorwaarden,
zoals gedeponeerd bij de K.v.K. te Middelburg. 3DSite

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.osgeo.org/pipermail/gdal-dev/attachments/20070601/3d76eafc/attachment.html


More information about the Gdal-dev mailing list