使用OpenMap API我可以使用哪个类从shapefile中提取点数据?

时间:2010-09-17 18:15:22

标签: java api coldfusion shapefile openmap

我目前正在使用Shapefile类和ColdFusion来浏览每个shapefile的“记录”。每个记录都有一个边界框,我能够获得这些信息,但还没有找到一种方法来实际检索每个记录中的点。

有人可以了解使用哪些课程以及如何使用它们?

这是完全相同的情况(包括一些废物):

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

尽管我使用的是ColdFusion,但我相信任何解决方案的提示都会对我有所帮助。

我目前的测试代码如下:

<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 个答案:

答案 0 :(得分:2)

我从来没有使用过这个,或者做过任何GIS,但在查看API之后,这是我的建议。

因此,在获得shapefile后,您会:

myESRIRecord = shapeFile.getNextRecord();

这将为您提供ESRIRecord类或其子类之一,具体取决于它的形状类型。

我弄乱的形状文件是:

http://russnelson.com/india.zip

仅包含polygon种类型。

ESRIPolygonRecord包含一个名为“polygons”的属性,其中包含一个com.bbn.openmap.layer.shape.ESRIPoly $ ESRIFloatPoly实例的数组。

看来,这个库的关键是很多数据属于属性,无法通过方法访问。

因此,正如我所说,ESRIPolygonRecords在多边形属性中有数据,ESRIPointRecord的数据在x和y属性中。所以,如果你正在寻找一个getX()或getY(),这就是为什么你没找到它。

此示例代码对我有用:

<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>