F# and ArcObjects, Part 3

Posted by Marko Apfel on Geeks with Blogs See other posts from Geeks with Blogs or by Marko Apfel
Published on Fri, 26 Mar 2010 11:15:27 GMT Indexed on 2010/03/26 18:23 UTC
Read the original article Hit count: 579

Filed under:

Today i played a little bit with IFeature-sequences and piping data.
The result was a calculator of the bounding box around all features in a feature class.

Maybe a little bit dirty, but for learning was it OK. ;-)

open System;;

#I "C:\Program Files\ArcGIS\DotNet";;
#r "ESRI.ArcGIS.System.dll";;
#r "ESRI.ArcGIS.DataSourcesGDB.dll";;
#r "ESRI.ArcGIS.Geodatabase.dll";;
#r "ESRI.ArcGIS.Geometry.dll";;
open ESRI.ArcGIS.esriSystem;;
open ESRI.ArcGIS.DataSourcesGDB;;
open ESRI.ArcGIS.Geodatabase;;
open ESRI.ArcGIS.Geometry;

let aoInitialize = new AoInitializeClass();;

let status = aoInitialize.Initialize(esriLicenseProductCode.esriLicenseProductCodeArcEditor);;

let workspacefactory = new SdeWorkspaceFactoryClass();;

let connection = "SERVER=okul;DATABASE=p;VERSION=sde.default;INSTANCE=sde:sqlserver:okul;USER=s;PASSWORD=g";;

let workspace = workspacefactory.OpenFromString(connection, 0);;

let featureWorkspace = (box workspace) :?> IFeatureWorkspace;;

let featureClass = featureWorkspace.OpenFeatureClass("Praxair.SFG.BP_L_ROHR");;

let queryFilter = new QueryFilterClass();;

let featureCursor = featureClass.Search(queryFilter, true);;

let featureCursorSeq (featureCursor : IFeatureCursor) = 
  let actualFeature = ref (featureCursor.NextFeature())
  seq {
    while (!actualFeature) <> null do
      yield actualFeature
      do actualFeature := featureCursor.NextFeature()
   };;

let min x y =
    if x < y then
        x
    else
        y;;

let max x y =
    if x > y then
        x
    else
        y;;

let info s (x : IEnvelope) =
    printfn "%s xMin:{%f} xMax: {%f} yMin:{%f} yMax: {%f}" s x.XMin x.XMax x.YMin x.YMax;;

let con (env1 : IEnvelope) (env2 : IEnvelope) =
    let env = (new EnvelopeClass()) :> IEnvelope
    env.XMin <- min env1.XMin env2.XMin
    env.XMax <- max env1.XMax env2.XMax
    env.YMin <- min env1.YMin env2.YMin
    env.YMax <- max env1.YMax env2.YMax
    info "Intermediate" env
    env;;


let feature = featureClass.GetFeature(100);;
let ext = feature.Extent;;

let BoundingBox featureClassName = 
    let featureClass = featureWorkspace.OpenFeatureClass(featureClassName)

    let queryFilter = new QueryFilterClass()

    let featureCursor = featureClass.Search(queryFilter, true)

    let featureCursorSeq (featureCursor : IFeatureCursor) = 
      let actualFeature = ref (featureCursor.NextFeature())
      seq {
        while (!actualFeature) <> null do
          yield actualFeature
          do actualFeature := featureCursor.NextFeature()
       }

    featureCursorSeq featureCursor
    |> Seq.map (fun feature -> (!feature).Extent)
    |> Seq.fold (fun (acc : IEnvelope) a -> 
        info "Intermediate" acc
        (con acc a)) ext
;;

let boundingBox = BoundingBox "Praxair.SFG.BP_L_ROHR";;
info "Ende-Info:" boundingBox;;

© Geeks with Blogs or respective owner