2012年3月19日

关键字:获取批处理文件所在路径

在批处理开头加入cd /d %~dp0 一行代码就真真实实地做到"编写一次,到处运行"。%0是批处理文件本身的路径,%~dp进行扩展, d向前扩展到驱动器,p往后扩展到路径。例如,你的bat文件在e:\mybat\test.bat,则%0就是e:\mybat\test.bat, %~dp0是e:\mybat\。
另外,%i提取第i个命令选项,例如%1提取第1个option,i可以取值从1到9


%~0: 取文件名(名+扩展名)
%~f0:取全路径
%~d0:取驱动器名
%~p0:只取路径(不包驱动器)
%~n0:只取文件名
%~x0:只取文件扩展名
%~s0:取缩写全路径名
%~a0:取文件属性
%~t0:取文件创建时间
%~z0:取文件大小
以上选项可以组合起来使用。

posted @ 2012-03-19 17:55 Gavin Young 阅读(15) 评论(0) 编辑

2012年3月7日

最近遇到一个问题,要求在Map上添加经过坐标配准的jpg图片,就是说要操作栅格数据,系统使用的是GIS平台是SharpMap。


SharpMap较新源代码中,增加了对GEOTIFF等影像的支持,它是利用GDAL开源库来实现的,GDAL是一个操作各种栅格地理数据,包括读取、写入、转换、处理各种栅格数据格式,下载源码并编译GDAL C#接口库相比来说较为麻烦,较为简单的是下载FWTools,其已经编译好,尽可使用,以下是我的操作步骤:


一、首先对图片进行配准,就是找到图片的左上角及右下角的地理坐标,注意坐标系统,我这里用的是WGS84;


二、下载安装FWTools:http://wiki.westgis.ac.cn/index.php/FWTools


三、在命令提示符下,打开FWTools安装目录下Bin目录,执行gdal_translate -of "JPEG" -a_ullr 116.3043957 39.9772123 116.3048185 39.9768273 -a_srs EPSG:4326 input.jpg output.jpg 说明:中间的坐标格式为左上,右下,input.jpg为输入文件路径,output.jpg为输出文件路径;执行命令成功后,在输出目录下,除了输出图片外,你还可以得到一个output.aux.xml文件,两个文件是配合使用的;


四、使用:创建GdalRasterLayer:
GdalRasterLayer gdalRasterLayer = new GdalRasterLayer(layerName,"output.jpg");
return gdalRasterLayer;
将生成的Layer加到Map的Layers集合里,重绘即可显示出来;
注意:图片文件与Xml文件要在同一个目录下;

 

posted @ 2012-03-07 18:11 Gavin Young 阅读(746) 评论(0) 编辑

2011年12月23日

环境:多线程,辅助线程与主线程同步问题

问题:主线程上使用AsyncOperationManager.CreateOperation创建了一个AsyncOperation,但在调用AsyncOperation.Post一个委托函数后,那个回调函数并未转到主线程上运行,由于辅助线程不能直接操作主线程上声明的变量,导致应用程序出现异常,主界面挂掉。

调试:在Main函数中,如果在实例化主窗体之前,调用AsyncOperationManager.CreateOperation创建一个AsyncOperation时,就会出现上述问题;但如果在实例化主窗体之后,创建AsyncOperation时,则不会出现上述问题;至此,问题解决,但两者都是在主线程上创建的AsyncOperation,只是创建位置不同,为何会出现不同的结果呢?

解决:通过谷歌大神,找到这样一段描述:
WindowsFormsSynchronizationContext is internally set for the main GUI thread when you create main form of your application. Later this synchronization context is used to execute delegates on the same main GUI thread.(出处
算是明白了,意思大概如下:创建你的应用程序主窗体后,在main GUI线程上内部设置的WindowsFormsSynchronizationContext,而后这个同步上下文才在同一个main GUI线程上执行那个回调函数。

使用Reflector看了下WindowsFormsSynchronizationContext,其构造函数:
public WindowsFormsSynchronizationContext()
{
this.DestinationThread = Thread.CurrentThread;
Application.ThreadContext context = Application.ThreadContext.FromCurrent();
if (context != null)
{
this.controlToSendTo = context.MarshalingControl;
}
}
设置controlToSendTo为当前上下文的MarshalingControl;其Post方法:
public override void Post(SendOrPostCallback d, object state)
{
if (this.controlToSendTo != null)
{
this.controlToSendTo.BeginInvoke(d, new object[] { state });
}
}
归根到底,还是使用了Control.BeginInvoke。

总结:
简单来说,主窗体未创建时,是不会得到WindowsFormsSynchronizationContext的,得到的是一个SynchronizationContext对象,那么在调用Post时,会在线程池中新起一个辅助线程去执行回调函数,这样就出现了异常:辅助线程修改主线程中声明的控件的属性。


posted @ 2011-12-23 19:24 Gavin Young 阅读(22) 评论(0) 编辑

2011年7月8日

从5月14号到7月8号,坚持骑车上班也有40个工作日了,每天来回13公里,算起来里程也有520公里了,还未曾做过保养,哈哈。
以下是个人骑车的一些心得,总结一下:

1、市区上下班通勤的话,没有多坏的路,首选应该是公路自行车,毕竟车轻,能节省不少体力;但公路车,速度快,车胎窄,注意控制车速与平衡;

2、为了安全起见,骑车最好不要带人,城市机动车流量大,负重容易失去平衡,非常危险,不要以为技术好,骑车是弱势,你保证了自己,但你控制不了别人,路上什么情况都可能发生;我当时考虑为了带人与雨雪天骑车,选择了山地车,事实证明,我的选择是错误的;

3、路上注意与电动车,机动车保持距离,机动车惹不起,电动车不要命;

4、注意选择合适车座,压力大都在此处,不合适的话,时间长容易造成局部麻木,不用多说,你懂的;

5、个人感觉最好的骑车季节是秋季,秋高气爽,顺着铺满落叶的道路,风驰而过,爽;

最后,随着自行车道不是变成停车场,就是变成临时机动车道,希望各位还在骑车的同学安全第一。

posted @ 2011-07-08 17:56 Gavin Young 阅读(8) 评论(0) 编辑

2011年6月28日

最近用到Protobufprotobuf是google提供的一个开源序列化框架,类似于XML,JSON这样的数据表示语言,其最大的特点是基于二进制,因此比传统的XML表示高效短小得多。虽然是二进制数据格式,但并没有因此变得复杂,开发人员通过按照一定的语法定义结构化的消息格式,然后送给命令行工具,工具将自动生成相关的类,可以支持java、c++、python等语言环境。通过将这些类包含在项目中,可以很轻松的调用相关方法来完成业务消息的序列化与反序列化工作。

相应的文档大家可以Google一下,我只是介绍一下我在使用过程中遇到的问题

因为需要反序列化返回的数据,而相应的实体类很多,为了区分出这些实体类,我在返回的数据包中加入一个字节来表示类型;

客户端在接收到数据后,根据网络传回的字节数组先确定类型,然后调用 ProtoBuf.Serializer.Deserialize<T>(Stream source)反序列化得到对象,本来我想通过以下:

Type type = Type.GetType(objectName);

ProtoBuf.Serializer.Deserialize<type>(ms);

类似方法来处理,奈何此处不允许我传入的类型参数,不得其解,只能退而求其次,采用以下方法,每个实体类型写一个反序列化的函数,再根据实体类型名称反射得到方法,执行方法得到数据:

MemoryStream ms = new MemoryStream(rawData);

Response response = null;
Type type = this.GetType();
MethodInfo desMethod = null;
desMethod = type.GetMethod("Des" + objectName);
if (desMethod != null)
{
object[] args = new object[] { ms };
response = (Response)desMethod.Invoke(this, args);
}

return response;

应该还有好的方法,放在这里,希望能引起大家的讨论。

posted @ 2011-06-28 16:32 Gavin Young 阅读(47) 评论(0) 编辑

2011年2月23日

摘要: lock语句 lock关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。此语句的形式如下: Object thisLock = new Object(); lock (thisLock) { // Critical code section } Monitor 类 当多线程同时用到一个对象时,也会出现和公用代码类似的问题,这时就不能用lock关键字了,需要用到Sys...阅读全文
posted @ 2011-02-23 16:31 Gavin Young 阅读(275) 评论(1) 编辑

2010年12月20日

摘要: 直接使用得到的GPS数据来加载到Google Map,会发现坐标点有偏移,这个是由中国规划局确定的一个偏移算法,实际上是没有什么特殊规律的,他的生成算法是有规律,不过这个规律你我都很难拿到,那我们怎么解决这个偏差呢? CSDN上有个牛人找到了Google修正偏移的接口,完美的解决了这个问题。 鉴于我手头的项目,我使用了每隔0.1个经纬度取个偏移量的数据,中国大陆的总数据量在10万条级别,效率与精度...阅读全文
posted @ 2010-12-20 11:25 Gavin Young 阅读(329) 评论(3) 编辑

2010年6月4日

摘要: 服务器上装了64位Oracle 10G,使用PL/SQL Developer无法连接,报无法找到OCI.DLL错误 解决步骤如下: 第一步:安装了Oracle 10G的客户端 第二步:PL/SQL Developer中设置OracleHome:OraClient109_home1 OCI library:OraClient109_home1\bin\oci.dll 第三步:登录PL/SQL De...阅读全文
posted @ 2010-06-04 12:11 Gavin Young 阅读(555) 评论(0) 编辑

2010年5月19日

摘要: public static int Main() { Stopwatch time = new Stopwatch(); time.Start(); for (int i = 0; i < 10000; i++) { int temp = 0; if (temp == 0) temp = 1; else temp = 0; } time.Stop(); System...阅读全文
posted @ 2010-05-19 11:54 Gavin Young 阅读(332) 评论(0) 编辑

2010年4月10日

摘要: 这片文章大体概括了一些设计网页中的大问题。希望能给你做下一个网页时给予一些儿启发。 1.记住:你能掌控的时间是有限的 我仅仅用4秒钟就能浏览完平常的页面,因此,你没有足够的时间吸引用户并让他们继续浏览你的网站。也就是说你应尽可能准确的描述你设计的网站是关于什么的。如果它需要让浏览者花费更多的时间去弄明白此网站是关于什么的,他将放弃并离开。 2、记住:用户是略读页面 当你进入一个房间时,你不会具...阅读全文
posted @ 2010-04-10 10:58 Gavin Young 阅读(7) 评论(0) 编辑
仅列出标题  下一页

导航

公告

统计