2010-09-17 28 views
1

J'utilise actuellement la classe Shapefile et ColdFusion pour parcourir les "enregistrements" de chaque fichier de formes. Chaque enregistrement a une boîte englobante et je suis capable d'obtenir cette information, mais je n'ai pas trouvé un moyen de récupérer réellement les points à l'intérieur de chaque enregistrement. Quelqu'un peut-il nous éclairer sur les classes à utiliser et comment les utiliser?Utilisation de l'API OpenMap quelle classe puis-je utiliser pour extraire des données ponctuelles à partir du fichier de formes?

Ceci est exactement la même situation (y compris certains verbage) comme:

http://old.nabble.com/what-class-do-you-use-to-extract-data-from-.SHP-files--td20208204.html

Allthough J'utilise ColdFusion, je crois que toutes les allusions à la solution me aiderait grandement.

Mon code de test en cours est la suivante:

<cfset shapeFile = createObject("java","com.bbn.openmap.layer.shape.ShapeFile")> 

<cfset shapeFile.init('/www/_Dev/tl_2009_25_place.shp')> 

<cfoutput> 
getFileLength = #shapeFile.getFileLength()#<br> 
getFileVersion = #shapeFile.getFileVersion()#<br> 
getShapeType = #shapeFile.getShapeType()#<br> 
toString = #shapeFile.toString()#<br> 
</cfoutput> 
<cfdump var="#shapeFile#"> 
<cfdump var="#shapeFile.getBoundingBox()#"> <br> 
<cfdump var="#shapeFile.getNextRecord()#"> 
+1

Peut-être que vous pouvez obtenir de l'aide directement auprès d'eux? http://openmap.bbn.com/contacts.html – Henry

Répondre

2

Je ne l'ai jamais utilisé cela, ou fait tout SIG, mais après avoir regardé l'API, voici ma suggestion.

Alors, une fois que vous avez votre shapefile, vous devez:

myESRIRecord = shapeFile.getNextRecord(); 

Cela vous obtient une classe ESRIRecord ou un de ses sous-classes, en fonction de ce type de forme il est.

Le shapefile que j'ai foiré avec pour comprendre cela est:

http://russnelson.com/india.zip

Et ne contient polygon types.

L'ESRIPolygonRecord contient une propriété appelée "polygones" qui contient un tableau d'instances com.bbn.openmap.layer.shape.ESRIPoly $ ESRIFloatPoly.

La clé de cette bibliothèque, semble-t-il, est que beaucoup de données se trouvent dans des propriétés, non accessibles par des méthodes. Donc, comme je l'ai dit, l'ESRIPolygonRecords a ses données dans la propriété polygones, l'ESRIPointRecord a ses données dans les propriétés x et y. Donc, si vous cherchez un getX() ou getY(), c'est pourquoi vous ne l'avez pas trouvé.

Ce code exemple a fonctionné pour moi:

<cfset shapeFile = createObject("java","com.bbn.openmap.layer.shape.ShapeFile")> 

<cfset shapeFile.init('/tmp/india-12-05.shp')> 

<!--- There may be more then one record, so you can repeat this, or loop to get 
     more records ---> 
<cfset myRecord = shapeFile.getNextRecord()> 

<!--- Get the polygons that make up this record ---> 
<cfset foo = myRecord.polygons> 

<cfdump var="#foo#"> 

<cfloop array="#foo#" index="thispoly"> 
<cfoutput> 
    This poly has #thisPoly.nPoints# points:<br> 
    <!--- because java arrays are 0 based ---> 
    <cfset loopEnd = thisPoly.nPoints-1> 
    <cfloop from="0" to="#loopEnd#" index="i"> 
     X: #thisPoly.getX(i)# Y: #thisPoly.getY(i)#<br> 
    </cfloop> 
    <!--- Returns points as array ---> 
    <cfdump var="#thisPoly.getDecimalDegrees()#"> 
    <cfdump var="#thisPoly.getRadians()#"> 
</cfoutput> 
</cfloop> 
+0

Cela a fonctionné très bien, j'ai dû changer certaines choses pour BlueDragon avec le cfloop ne supportant pas l'attribut tableau, mais fonctionne bien. Merci un million! – cfEngineers

+0

Je suis heureux que cela a fonctionné pour vous! Cette question m'a intéressée à jouer plus avec cette bibliothèque! –