Shape文件由ESRI开发。一个ESRI(Environmental Systems Research Institute)的shape文件包含一个主文件,一个索引文件,和一个dBASE表。
当中主文件的后缀就是.shp。
Shape文件已经是一种开源的文件格式。官方早在2006年就出版了对应的白皮书,对整个文件的读写进行了具体的说明,这样也使得Shape文件应用的更加广泛。本人在移动GIS开发的过程中,借机对.shp文件进行了研究,并简单实现了通过JAVA语言对.shp文件的读写操作功能。
================================================ 我是分隔线==============================================
1、Shape文件
ESRI 的shape 文件由一个主文件、一个索引文件和一个dBASE 表构成。主文件是一个可变记录长度的随机文件。文件里的每一个记录描写叙述一个包括多个顶点的shape。在索引文件里,每一个记录内容包括着与主文件里记录相相应的从主文件開始处的偏移量。
dBASE
表中包括着与每一个要素相相应的一条要素属性记录。
几何数据与属性的一一相应关系是基于记录号来相应的。dBASE 文件里属性记录的顺序必须与主文件里的记录顺序同样。
2、java实现shape文件的读取
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.database.Cursor;
import android.os.Environment;
import android.widget.Toast;
public class ReadShapeFile_DAL {
//分别用于存放shp文件和dbs文件。要求一一相应
private List g_shpFileName;
private List g_dbfFileName;
private List g_shpAndDbfFiles;
private Activity g_at;
private String SDPATH;//离线矢量文件存储路径
public ReadShapeFile_DAL()
{
}
public void SetSDPath(String _path)
{
SDPATH=_path;
}
/**
* 推断机器中是否有存储卡
* @return
*/
private static boolean haveSDCARD() {
String status = Environment.getExternalStorageState();
if (status.equals(Environment.MEDIA_MOUNTED))
{
return true;
}
else
{
return false;
}
}
//读取文件夹中的.shp和.dbf文件
public boolean ListFile(Activity _at)
{
boolean flag=false;
g_at=_at;
g_shpFileName=new ArrayList();
g_dbfFileName=new ArrayList();
g_shpAndDbfFiles=new ArrayList();
if(haveSDCARD()){
//得到当前外部存储设备的文件夹( /SDCARD )
SDPATH = Environment.getExternalStorageDirectory() + "/LandMonitoringCollectionSystem";
}else{
//手机中文件放置路径
SDPATH = "/data/data/featuredata";
}
try
{
File dirs = new File(SDPATH);
File [] filenames=dirs.listFiles();
if(filenames.length==0)
{
return flag;
}
else
{
for(int i =0;i
{
File file = filenames[i];
if(file.isFile())
{
if(file.getName().endsWith(".shp"))
{
g_shpFileName.add(file);
}
else
{
if(file.getName().endsWith(".dbf"))
{
g_dbfFileName.add(file);
}
}
}
}
}
//推断矢量文件是否存在
if(g_shpFileName.size()<1)
{
Toast.makeText(g_at, "数据读取失败,请确定离线数据存在",Toast.LENGTH_SHORT).show();
return false;
}
else
{
g_shpAndDbfFiles=fileConfig(g_shpFileName,g_dbfFileName);
}
if(shpDataInsert())
return true;
}
catch(Exception e)
{
e.printStackTrace();
g_shpAndDbfFiles=new ArrayList();
Toast.makeText(g_at,"数据读取失败,请确定离线数据存储的文件夹正确",Toast.LENGTH_SHORT).show();
}
return flag;
}
private boolean shpDataInsert()
{
boolean flag=true;
DataTableManagement g_myTableExcute=new DataTableManagement(g_at);
//在此删除全部的矢量数据表
String selectsql = "select * from sqlite_master";
g_myTableExcute = new DataTableManagement(g_at);
Cursor cs = g_myTableExcute.excuteCursorTable(selectsql);
while(cs.moveToNext())
{
String tableName = cs.ge