ArcGIS Engine开发中数据库的加载

1、加载个人地理数据库数据

个人地理数据库(Personal Geodatabase)使用Miscrosoft Access文件(*.mdb)进行空间数据的存储和管理,它将不同的数据统一纳入Access文件中,便于数据的管理与迁移,容量限制为2GB。个人地理数据库支持单用户编辑,不支持版本管理。在进行ArcGIS软件操作和开发的学习过程中,一般建议采用个人地理数据库进行数据的 组织和存储,同时也便于直接导到ArcSDE空间数据库中。加载个人地理数据库的用到的接口为:IFeatureDataset、IEnumDataset。

1.IFeatureDataset接口:继承自IDataset接口,在其基础上增加一个 创建要素类的功能CreateFeatureClass。

2.IEnumDataset接口:用于访问个人地理数据库中的所有数据集成员,有Reset和Next两个方法。Reset方法重置数据集序列,使指针位于第一个数据集之前;Next方法获取枚举序列的 下一个数据集。

实现的思路:

1)床架AccessWorkspaceFactory类的实例。

2)用IWorkspaceFactory接口的OpenFromFile方法打开.mdb数据集的工作空间,对工作空间里面的数据进行加载。

代码1:对加载数据库的方法进行函数封装

 #region
//封装加载空间数据库方法:AddAllDataset函数,以便对其他空间数据库加载时直接调用。
private void AddAllDataset(IWorkspace pWorkspace, AxMapControl mapControl)
{
IEnumDataset pEnumDataset = pWorkspace.get_Datasets(ESRI.ArcGIS.Geodatabase.esriDatasetType.esriDTAny);
pEnumDataset.Reset();
//将Enum数据集集中的数据一个一个地读到dataset 中
IDataset pDataset = pEnumDataset.Next();
//判断数据集是否有数据
while (pDataset != null)
{
if (pDataset is IFeatureDataset)//要素数据集
{
IFeatureWorkspace pFeatureWorkspac = (IFeatureWorkspace)pWorkspace;
IFeatureDataset pFeatureDataset = pFeatureWorkspac.OpenFeatureDataset(pDataset.Name);
IEnumDataset pEnumDataset1 = pFeatureDataset.Subsets;
pEnumDataset1.Reset();
IGroupLayer pGroupLayer = new GroupLayerClass();
pGroupLayer.Name = pFeatureDataset.Name;
IDataset pDataset1 = pEnumDataset1.Next();
while (pDataset1 != null)
{
if (pDataset1 is IFeatureClass)//要素类
{
IFeatureLayer pFeatureLayer = new FeatureLayerClass();
pFeatureLayer.FeatureClass = pFeatureWorkspac.OpenFeatureClass(pDataset1.Name);
if (pFeatureLayer.FeatureClass != null)
{
pFeatureLayer.Name = pFeatureLayer.FeatureClass.AliasName;
pGroupLayer.Add(pFeatureLayer);
mapControl.Map.AddLayer(pFeatureLayer);
}
}
pDataset1 = pEnumDataset1.Next();
}
}
else if (pDataset is IFeatureClass)//要素类
{
IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace)pWorkspace;
IFeatureLayer pFeatureLayer = new FeatureLayerClass();
pFeatureLayer.FeatureClass = pFeatureWorkspace.OpenFeatureClass(pDataset.Name);
pFeatureLayer.Name = pFeatureLayer.FeatureClass.AliasName;
mapControl.Map.AddLayer(pFeatureLayer);
}
else if (pDataset is IRasterDataset)//栅格数据
{
IRasterWorkspaceEx pRasterWorkspace = (IRasterWorkspaceEx)pWorkspace;
IRasterDataset pRasterDataset = pRasterWorkspace.OpenRasterDataset(pDataset.Name);
//影像金字塔的判断和创建
IRasterPyramid3 pRasterPyramid;
pRasterPyramid = pRasterDataset as IRasterPyramid3;
if (pRasterPyramid != null)
{
if (!(pRasterPyramid.Present))
{
pRasterPyramid.Create();//创建金字塔
}
}
IRasterLayer pRasterLayer = new RasterLayerClass();
pRasterLayer.CreateFromDataset(pRasterDataset);
ILayer pLayer = pRasterLayer as ILayer;//进行继承
mapControl.AddLayer(pLayer, );
}
pDataset = pEnumDataset.Next();
}
mapControl.ActiveView.Refresh();
//同步鹰眼
// SynchronizeEagleEye();
}
#endregion

代码2:调用个人地理数据库

  ////加载个人地理数据库
OpenFileDialog pOpenFileDialog = new OpenFileDialog();
pOpenFileDialog .Title ="打开PersonGeoDatabase文件";
pOpenFileDialog.Filter = "Personal GeoDatabase(*.mdb)|*.mdb";
pOpenFileDialog.ShowDialog();
string pFullPath = pOpenFileDialog.FileName;
if (pFullPath == "") return;
AccessWorkspaceFactory pAccessWorkspaceFactory = new AccessWorkspaceFactoryClass();
//获取工作空间
IWorkspace pWorkspace = pAccessWorkspaceFactory.OpenFromFile(pFullPath ,);
ClearAllData();
AddAllDataset(pWorkspace,mainMapControl );

2.加载文件地理数据库

文件地理数据库(File GeoDatabase)是以文件夹形式存储各种类型的GIS数据集,可以存储查询和管理空间数据和非空间数据,支持地理数据库的大小为1TB,在不使用数据库管理系统的情况下能够扩展并存储大量的数据,是继个人地理数据库之后esr推出的新的数据管理系统。文件地理数据库支持单用户编辑,不支版本管理。

实现的思路:

1)由于文件地理数据库是以文件夹的形式存在的,因此可以使用FolderBrowserDialog选择文件夹进行加载。首先创建FileGDBWorkspaceFactoryClass类的实例。

2)使用IWorkspaceFactory接口的OpenFromFile方法打开文件地理数据库的工作空间,对工作空间中的文件夹进行加载。

////加载文件地理数据库数据
FolderBrowserDialog dlg = new System.Windows.Forms.FolderBrowserDialog();
if(dlg.ShowDialog ()!=DialogResult .OK ) return ;
string pFullth=dlg.SelectedPath ;
if(pFullth =="") return ;
//使用esri.arcgis.DataSourseGDB
FileGDBWorkspaceFactory pFileGDBWorkspaceFactory=new FileGDBWorkspaceFactoryClass();
ClearAllData ();
//获取工作空间
IWorkspace pWorkspac=pFileGDBWorkspaceFactory .OpenFromFile (pFullth ,);
AddAllDataset (pWorkspac,mainMapControl);

3.加载ARCSDE空间数据库数据

ArSDE(Spatial Database Engine空间数据库引擎)是在现有的关型数据库上进行的空间扩展,它使空间数据能保存在关系数据库中(如oracle,sqlserver中)ArcSDE空间数据库的一个重要的特点就是支持多用户并发操作,并且可以通过版本来表现空间数据编辑的状态。当完成数据编辑后,可将多人的编辑状态进行版版本合并,若多个用户对同一个要素进行了编辑,且编辑的状态不一样,将会出现“版本冲突”,提示用户采用哪一版本的数据。版本最后确定取决于用户对于数据管理的权限。

1、ArcSDE的组成

由ArcSDE服务管理进程、专用服务器进程、ArcSDE客户端三部分组成。

ArcSDE服务器管理进程负责维护ArcSDE和监听来自客户端的链接请求。ARCSDE启动就是ArcSDE服务器管理进程,利用管理员账户管理ArcSDE与RDBMS的连接,处理客户端的连接请求。

专用服务器进程由ArcSDE服务器管理进程创建,用于每一个特定的客户端应用程序与数据库的连接。

ArcSDE客户端通过ArcSDE服务器管理进程和专用服务器进程建立和RDBMS的连接,实现对数据库的操作。

、ArcSDE数据库的连接方式

ArcSDE提供了应用服务器连接和直接连接两种连接方式。当服务器性能较好时可采用应用服务器连接,否则采用直接连接,为了减轻服务器的压力,建议采用直接连接的方式进行连接。

应用服务器连接和直接连接的主要区别是属性参数的设置不同:

1)应用服务器连接参数的设置

服务器(Server):SDE服务器的主机名称。

数据库实例(Instance):安装SDE时选择的端口,默认为5151或esri_sde。

数据库(DataBase).根据不同的DBMS决定是否填写。Oracle系列不用填,而SQlServer需要填写。

用户名(Usename):需要填写

密码(Password):需要填写。

2)直接连接的参数设置

服务器(Server):不用填写

数据库实例(Instance):SDE数据类型,例如:如果是Oracle 11g,则为SDE:Oracle:11g:Orcl。其中orcl为数据库的服务名。

数据库(Database):根据不同的DBMS决定是否填写。

用户名(Username):需要填写

密码(password):需要填写

3)两种连接方式的异同

直接连接就是通过ArcSDE访问数据库,并在本地完成对数据库的各种操作(如空间分析、编辑等):而应用服务器连接就是通过ARCSDE访问数据表后,在服务器端完成对数据的各种操作,再把操作结果返回客户端。因此,即便服务器上SDE服务没有启动,采用直接连接的方式也可以直接访问和操作SED数据库,而应用服务器连接只有在SDE服务器启动后才能访问和操作SDE数据库。

SDE 数据库的加载主要用到IPropertySet接口。属性几何(PropertySet)对象是一个专门用于设置属性的对象,它是一种【名称】——【值】对应的集合,类似于哈希表或字典。

4)实例程序的思路:

① 创建SdeWorkspaceFactoryClas类的实例。

②通过SDE连接的连接属性打开SDE数据库的工作空间,对工作空间里面的数据进行加载。

 private void btnFileDatabase_ItemClick(object sender, ItemClickEventArgs e)
{
////加载文件地理数据库数据
FolderBrowserDialog dlg = new System.Windows.Forms.FolderBrowserDialog();
if (dlg.ShowDialog() != DialogResult.OK) return;
string pFullth = dlg.SelectedPath;
if (pFullth == "") return;
//使用esri.arcgis.DataSourseGDB
FileGDBWorkspaceFactory pFileGDBWorkspaceFactory = new FileGDBWorkspaceFactoryClass();
ClearAllData();
//获取工作空间
IWorkspace pWorkspac = pFileGDBWorkspaceFactory.OpenFromFile(pFullth, );
AddAllDataset(pWorkspac, mainMapControl);
}
/// <summary>
/// 服务器连接,以Oracle数据库为例
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnaddSDEByServer_ItemClick(object sender, ItemClickEventArgs e)
{
IWorkspace pWorkspace;
pWorkspace = arcSDEWorkspaceOpen("192.168.70.110", "esri_sde", "sde", "sde", "", "SDE.DEFAULT");//调用定义的函数 }
/// <summary>
/// 定义函数arcSDEWorkspaceOpen(),用于连接数据库
/// </summary>
/// <returns></returns> private IWorkspace arcSDEWorkspaceOpen(string server, string instance, string user, string password, string database, string version)
{
IWorkspace pWorkSpace = null;
//创建和实例化数据集
IPropertySet pPropertySet = new PropertySetClass();
pPropertySet.SetProperty("SERVER", server);
pPropertySet.SetProperty("SERVER", server);
pPropertySet.SetProperty("INSTANCE", instance);
pPropertySet.SetProperty("USER", user);
pPropertySet.SetProperty("PASSWORD", password);
pPropertySet.SetProperty("DATABASE", database);
pPropertySet.SetProperty("VERSION", version);
IWorkspaceFactory2 pWorkspaceFactory = new SdeWorkspaceFactoryClass(); try
{
pWorkSpace = pWorkspaceFactory.Open(pPropertySet, );
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
return pWorkSpace;
}
/// <summary>
/// 直接连接数据库
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnaddSDEByDriect_ItemClick(object sender, ItemClickEventArgs e)
{
IWorkspace pWorkspace;
pWorkspace = arcSDEWorkspaceOpen("", "sde:oracle11g:orcl", "sde", "sde", "", "SDE.DEFAULT");
//如果工作空间不为空,则进行加载
if (pWorkspace != null)
{
AddAllDataset(pWorkspace, mainMapControl);
} }

四、加载文本文件数据

野外测量的数据是GIS数据的一个主要来源,如GPS、全站仪等仪器测量的数据等,这类数据通常为含有X/Y坐标的Excel文件或者文本文件。

实现的思路:

1)根据Excel或者.txt文件等获取点的坐标信息。

2)根据点的坐标创建ShapeFile图层。

3)加载该shapefile图层。

具体代码:

         /// <summary>
/// 进行函数的声明,调用AxControl控件
/// </summary>
/// 定义函数,并返回值
private AxMapControl buddyMap;
public AxMapControl BuddyMap
{
get { return buddyMap; }
set { buddyMap = value; }
} /// <summary>
/// 创建一个点结构,进行点信息的存储
/// </summary>
struct CPoint
{
public string Name;
public double X;
public double Y;
}
/// <summary>
/// 定义全局变量的数组pColumns用来存储点数据
/// </summary>
List<string> pColumns = new List<string>(); public FormAddtxtData()
{
InitializeComponent();
} private void FormAddtxtData_Load(object sender, EventArgs e)
{ }
/// <summary>
/// 打开文本格式文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnOpen_Click(object sender, EventArgs e)
{
OpenFileDialog pOpenFileDialog = new OpenFileDialog();
pOpenFileDialog.Title = "打开测量数据文件";
pOpenFileDialog.Filter = "测量坐标文件(*.txt)|*.txt";
if (pOpenFileDialog.ShowDialog() == DialogResult.OK)
{
txtSource.Text = pOpenFileDialog.FileName;//获取显示文件名
}
}
/// <summary>
/// 将文本格式保存成shape格式,调用刺痛保存文本的函数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSave_Click(object sender, EventArgs e)
{
SaveFileDialog pSaveFileDialog = new SaveFileDialog();
pSaveFileDialog.Filter = "Shape 文件(*.shp)|*.shp";
if (File.Exists(txtSource.Text))
{
pSaveFileDialog.FileName = System.IO.Path.GetFileNameWithoutExtension(txtSource.Text);//返回不具有返回值的指定路径的文件名
}
if (pSaveFileDialog.ShowDialog() == DialogResult.OK)
{
txtSave.Text = pSaveFileDialog.FileName;
} }
/// <summary>
/// 创建并实例化一个CPoint类型的数组,将所有的点信息进行 存储
/// </summary>
/// <param name="surveyDataFullName"></param>
/// <returns></returns>
private List<CPoint> GetPoints(string surveyDataFullName)
{
try
{
List<CPoint> pList = new List<CPoint>();
char[] charArray = new char[] { ',', ' ', '\t' }; //常用的分隔符为逗号、空格、制位符
//文本信息读取
FileStream fs = new FileStream(surveyDataFullName, FileMode.Open);
StreamReader sr = new StreamReader(fs, Encoding.Default);
string strLine = sr.ReadLine();
if (strLine != null)
{
string[] strArray = strLine.Split(charArray);
if (strArray.Length > )
{
for (int i = ; i < strArray.Length; i++)
{
pColumns.Add(strArray[i]);
}
} while ((strLine= sr.ReadLine())!=null)
{
//点信息的读取
strArray = strLine.Split(charArray);
CPoint pCPoint = new CPoint();
pCPoint.Name = strArray[].Trim();
pCPoint.X = Convert.ToDouble(strArray[]);
pCPoint.Y = Convert.ToDouble(strArray[]); pList.Add(pCPoint);
}
}
else
{
return null;
}
sr.Close();
return pList;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return null;
}
}
/// <summary>
/// 封装函数,根据点坐标进行创建shapefile图层
/// </summary>
/// <param name="cPointList"></param>
/// <param name="filePath"></param>
/// <returns></returns>
private IFeatureLayer CreateShpFromPoints(List<CPoint> cPointList, string filePath)
{
int index = filePath.LastIndexOf('\\');
string folder = filePath.Substring(, index);
string shapeName = filePath.Substring(index + );
IWorkspaceFactory pWSF = new ShapefileWorkspaceFactoryClass();
IFeatureWorkspace pFWS = (IFeatureWorkspace)pWSF.OpenFromFile(folder, ); IFields pFields = new FieldsClass();
IFieldsEdit pFieldsEdit;
pFieldsEdit = (IFieldsEdit)pFields; IField pField = new FieldClass();
IFieldEdit pFieldEdit = (IFieldEdit)pField;
pFieldEdit.Name_2 = "Shape";
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
IGeometryDef pGeometryDef = new GeometryDefClass();
IGeometryDefEdit pGDefEdit = (IGeometryDefEdit)pGeometryDef;
pGDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint;
//定义坐标系
ISpatialReferenceFactory pSRF = new SpatialReferenceEnvironmentClass();
ISpatialReference pSpatialReference = pSRF.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_Beijing1954);
pGDefEdit.SpatialReference_2 = pSpatialReference; pFieldEdit.GeometryDef_2 = pGeometryDef;
pFieldsEdit.AddField(pField); IFeatureClass pFeatureClass;
pFeatureClass = pFWS.CreateFeatureClass(shapeName, pFields, null, null, esriFeatureType.esriFTSimple, "Shape", ""); IPoint pPoint = new PointClass();
for (int j = ; j < cPointList.Count; j++)
{
pPoint.X = cPointList[j].X;
pPoint.Y = cPointList[j].Y; IFeature pFeature = pFeatureClass.CreateFeature();
pFeature.Shape = pPoint;
pFeature.Store();
} IFeatureLayer pFeatureLayer = new FeatureLayerClass();
pFeatureLayer.Name = shapeName;
pFeatureLayer.FeatureClass = pFeatureClass;
return pFeatureLayer;
}
/// <summary>
/// 定义一个函数进行验证数据和存储位置是否有效
/// </summary>
/// <returns></returns>
private bool ValidateTxtbox()
{
if (txtSource.Text == "" || !File.Exists(txtSource.Text))
{
MessageBox.Show("测量数据无效,请重新选择!", "提示", MessageBoxButtons.OK);
return false;
}
if (txtSave.Text == "" || System.IO.Path.GetExtension(txtSave.Text).ToLower() != ".shp")
{
MessageBox.Show("保存路径无效,请重新选择!", "提示", MessageBoxButtons.OK);
return false;
}
return true;
}
/// <summary>
/// 调用函数,将生成的shape文件加载到mapControl中
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnCreat_Click(object sender, EventArgs e)
{
if (ValidateTxtbox())
{
List<CPoint> pCPointList = GetPoints(txtSource.Text);
if (pCPointList == null)
{
MessageBox.Show("所选择的文件为空,请重新选择!");
}
else
{
//实例化要素图层,进行添加
IFeatureLayer pFeatureLayer = CreateShpFromPoints(pCPointList, txtSave.Text);//传入实参数据
buddyMap.Map.AddLayer(pFeatureLayer);
this.Close();
}
} } private void btnCancel_Click(object sender, EventArgs e)
{
this.Close();
}
}

总结: 由上述ArcGIS Engine加载几种常用的数据源的方法,可以看出ArcGIS Engine加载空间数据一般具有以下的五个步骤:

1)创建数据对应的工作空间工厂(WorkspaceFactory)。

2)使用WorkspaceFactory创建要加载数据的工作空间Workspace。

3)使用Workspace打开并得到图层的数据集。

4)强Dataset赋值给新建图层的数据源。

5)添加图层到MapControl中进行显示。

ArcGIS Engine开发之地图基本操作(4)的更多相关文章

  1. ArcGIS Engine开发之地图基本操作(3)

    地图数据的加载 一.加载Shapefile数据 Shapefile文件是目前主流的一种空间数据的文件存储方式,也是不同GIS软件进行数据格式转换常用的中间格式.加载Shapefile数据的方式有两种: ...

  2. ArcGIS Engine开发之地图基本操作(2)

    地图数据的加载 1.加载地图文档 ArcGIS Engine支持加载多种类型的数据,有矢量数据的Coverage.Shapefile.dwg/dxf文件,栅格数据的BMP.GRID.控件数据库等.很多 ...

  3. ArcGIS Engine开发之地图基本操作(1)

    ArcGIS提供的各类数据形式以及相应接口 1. 空间数据 在GIS软件中,空间数据有多种不同的形式存在.按照不同的划分标准可以分为矢量数据和栅格数据.GIS格式数据和非GIS格式数据(CAD格式). ...

  4. ArcGIS Engine开发之地图浏览

    地图的浏览功能包括缩放.移动.量测旋转等. 1.放大与缩小 无论是放大还是缩小,都是通过改变MapControl中当前视图的范围Extent属性来实现的,主要用到包络线(Envelope)类. 包络线 ...

  5. ArcGIS Engine开发之地图导出

    关于地图导出的方法有很多,但是核心技术就那么一点.下面是从项目实战中总结的一部分地图导出的方法:(以全域导出和区域导出为例) 1.由于地图导出用到的函数和方法容易重复,增加了工作量故首先将其进行封装成 ...

  6. ArcGIS Engine开发前基础知识(2)

    ArcGIS基本控件简介 ArcGIS Engine控件是一组可视化的开发组件,每个ArcGIS Engine控件都是一个COM组件.这些组件包括MapControl,PageLayoutContro ...

  7. C#,ArcGIS Engine开发入门教程

    C#,ArcGIS Engine开发入门教程 转自:http://blog.csdn.net/yanleigis/article/details/2233674  目录(?)[+] 五实现 一 加载A ...

  8. ArcGIS Engine开发基础总结(一)

    标准Engine功能 地图浏览    地图制作 数据查询 数据分析 及 所有的开发控件 —MapControl, PageLayout, Toolbar, TOC, ArcReader 对所有矢量和栅 ...

  9. ArcGIS Engine开发鹰眼图的功能(基础篇)

    鹰眼是用于调节全视域范围内主地图显示范围情况的副地图.它体现了地图整体与详细局部的关系. 用户可以通过鼠标单击或者画框等动作实现鹰眼与主地图的交互情况. 鹰眼功能的原理是通过主地图窗口的地图控件和鹰眼 ...

随机推荐

  1. 虚拟机VMware12.05下安装Ubuntu16.04几个关键地方

    在踩了自己按照网上的教程安装Ubuntu之后,仍然踩了不少坑,鼓捣了一段时间,才达到自己想要的界面.   下面就来说说,大家可能也会遇到的情况:   1.安装ISO镜像时候,路径直接选择 你从Ubun ...

  2. 机器指令翻译成 JavaScript —— No.5 指令变化

    上一篇,我们通过内置解释器的方案,解决任意跳转的问题.同时,也提到另一个问题:如果指令发生变化,又该如何应对. 指令自改 如果指令加载到 RAM 中,那就和普通数据一样,也是可以随意修改的.然而,对应 ...

  3. 让 asp.net 在 mac 上飞

    .NET 不跨平台一直饱受争议,虽然微软前端时间放出些消息,要支持.NET跨平台的发展,但是微软一直坚持着不主动.不拒绝.不负责的三不态度,仍然用一种软件帝国的心态,折腾着一些毫无新意的东西.微软想要 ...

  4. .net垃圾回收机制编程调试试验

    1. 什么是CLR GC? 它是一个基于引用跟踪和代的垃圾回收器. 从本质上,它为系统中所有活跃对象都实现了一种引用跟踪模式,如果一个对象没有任何引用指向它,那么这个对象就被认为是垃圾对象,并且可以被 ...

  5. Leetcode 笔记 110 - Balanced Binary Tree

    题目链接:Balanced Binary Tree | LeetCode OJ Given a binary tree, determine if it is height-balanced. For ...

  6. js中几种实用的跨域方法原理详解(转)

    今天研究js跨域问题的时候发现一篇好博,非常详细地讲解了js几种跨域方法的原理,特分享一下. 原博地址:http://www.cnblogs.com/2050/p/3191744.html 下面正文开 ...

  7. 用java开发微信公众号:接收和被动回复普通消息(三)

    上篇说完了如何接入微信公众号,本文说一下微信公众号的最基本功能:普通消息的接收和回复.说到普通消息,那么什么是微信公众号所定义的普通消息呢,微信开发者文档中提到的接收的普通消息包括如下几类: 1.文本 ...

  8. 迟来的Json反序列化

    源码发布 搞了一个下午,终于搞定了这个号称中国的github...以后源码直接在这里发布了(github实在用不来,英文实在太烂了) https://code.csdn.net/jy02305022/ ...

  9. Python标准模块--threading

    1 模块简介 threading模块在Python1.5.2中首次引入,是低级thread模块的一个增强版.threading模块让线程使用起来更加容易,允许程序同一时间运行多个操作. 不过请注意,P ...

  10. Geotrellis系列文章链接

    本文存放了我在博客园中撰写的Geotrellis系列文章链接,方便查阅! 一.geotrellis使用初探 二.geotrellis使用(二)geotrellis-chatta-demo以及geotr ...