kalmanfans's Blog

模式识别 非线性预测 复杂网络 Following your heart

图解将shape file导入MySQL数据库中

本文介绍通过网上流传的《将shp文件导入到mysql的命令.rar》将shp文件导入到MySQL数据库中。

 

首先下载《将shp文件导入到mysql的命令。rar》并解压。将文件名改为字符的吧,省去不必要的麻烦。(如果不能下载,email至shchen.lmars@live.cn, 标题:《求<将shp文件导入到mysql的命令。rar>》)

第二部:准备文件。

一个shp文件有多个文件组成, .dbf, .sbn, .sbx, .shp, .shx.

将shp以及shp的相关文件和DOShere文件放在同一目录下。

第三:执行生成sql的命令。

shp2MySQL shp文件名.shp 表名 数据库名 > 生成的sql文件名.sql

 

进入该文件目录, 

 

第四:修改生成的sql文件:

修改table表的字段名;

  1. ALTER TABLE 表名 ADD the_geom GEOMETRY; 

add必须为:the_geom GEOMETRY。我的情况是,生成的sql中,有

ALTER TABLE 表名 ADD ogc_geom GEOMETRY;

只需要修改字段名为 the_geom。

替换所有的,-1) );为) );  就是说去掉“,-1”。

第五:到MySQL数据库导入sql文件即可

 

我碰到的新问题:

Cygwin1.dll的处置。

在DOshere命令窗口中执行命令时,弹出错误信息:

 

计算机中丢失cygwin1l.dll。尝试重新安装该程序以解决此问题

 

解决之道,下载cygwin1l.dll (http://www.dll-files.com/dllindex/dll-files.shtml?cygwin1)

并解压到相应的目录。

Open the zip-file you downloaded from DLL-files.com.

Extract cygwin1.dll to a location on your computer. We recommend you to unzip it to the directory of the program that is requesting cygwin1.dll.

If that doesn't work, you will have to extract cygwin1.dll to your system directory. By default, this is:

  • C:\Windows\System (Windows 95/98/Me)
  • C:\WINNT\System32 (Windows NT/2000)
  • C:\Windows\System32 (Windows XP, Vista, 7)

If you use a 64-bit version of Windows, you should also place cygwin1.dll in C:\Windows\SysWOW64\

Make sure overwrite any existing files (but make a backup copy of the original file).

Reboot your computer.

If the problem still occurs, try the following:

  1. Open Windows Start menu and select "Run...".
  2. Type CMD and press Enter (or if you use Windows ME, type COMMAND)).
  3. Type regsvr32 cygwin1.dll and press Enter.

INSERT INTO signal_strength_table VALUES('0','10045','26374','1.84194519856e+005','0',GeometryFromText('MULTIPOLYGON(((3474163.683371824212372 5503441.758485510945320 ,3474163.532771822530776 5503410.121985509991646 ,3474317.550171823706478 5503441.905285511165857 ,3474163.683371824212372 5503441.758485510945320 )))',-1) );

__________________________________________________________________________________________________

i have got new version of SHP2MySQL software from Köbben (ITC, GIP) from the website of: http://home.lijbrandt.nl/bjkobben/RIMapper/

it is more convenient to import the shape file data into MySQL database.   

write to me: shchen.lmars@live.cn, if possible.

Matlab中 的accumarray函数

碰到函数accumarray是在rocwood的关于寻找完全数的程序中。没找到M文件,Document中有语法分析,没看懂。结合例子,作简单说明。

Syntax

A = accumarray(sub, val)

A = accumarray(sub, val, sz)

A = accumarray(sub, val, sz, fun)

A = accumarray(sub, val, sz, fun, fillvalue)

  sub:提供累计信息的指示向量

  val:提供累计数值的向量

  sz:控制输出向量A的size

  fun:用于计算累计后向量的函数,默认为@sum,即累加

  fillvalues: 填补A中的空缺值,默认为0

 

Matlab的Document 里这么说:

accumarray groups elements from a data set and applies a function to each group. A = accumarray(subs,val) creates an array A by accumulating elements of the vector val using the elements of subs as indices. The position of an element in subs determines which value of vals it selects for the accumulated vector; the value of an element in subs determines the position of the accumulated vector in the output.

对于A = accumarray(subs,val)这么一个调用,有这么几个问题,理解清楚,就理解了这个函数。

例子:

val    =     [     1     2     3     4     5    6]

subs =     [     1     2     4     2     4    3]'  % subs是列向量

 

Q: accumarray总体是干嘛的?

A: 笼统的说,是用subs向量中的信息从val中提取数值做累加,累加完的结果放到A中。

 

Q: subs是干嘛的?

A: subs是一个累加指示向量。

subs提供的信息由两个:

(a). subs向量中的每个位置对应val的每个位置;

(b). subs中元素值相同的,val中的对应元素累加,元素值是累加完后放到A的什么地方。

       如:上面的例子中,subs(2),subs(4)都是2,所以,val(2)和val(4)累加起来,放到A(2)这个位置上。

 

Q: val是干嘛的?

A: val是提供累加数值的,谁累加呢?就是A中的数值累加。选哪些数进行累加呢?subs向量中数值相同的对应位置的数。累加完后放到哪里呢?放到subs中指示的位置。

 

Q: A是怎么出来的?A的维度是什么?A的内容如何确定?

A: A的维度是subs中表示维度的数值最大的那个,如例子中size(A,1)==4,因为max(subs)==4。当然,这只是一维的情况。

最后A的结果就是:

A =  

     1   % subs(1)==1,所以,A(1) = val(1)。  

     6   % subs(2)==subs(4)==2,所以,A(2)=val(2)+val(4)  

     6   % subs(6)==3的值, A(3) = Val (6) = 6 

    8   % subs(3)==subs(5)==4,所以,A(4)=val(3)+val(5)  

 

产生一个2*3*4的矩阵

ind = [1 1 1; 2 1 2; 2 3 4; 2 3 4];

A = accumarray(ind,11:14)

A(:,:,1) =

     11     0     0

     0     0     0

  

A(:,:,2) =

      0     0     0

    12     0     0

 

 

A(:,:,3) =

 

     0     0     0

     0     0     0

 

A(:,:,4) =

      0     0     0

     0     0    27

 

另外,关于二维和高维矩阵,只是大概知道A矩阵的维度,数值的变化不详细得知。

References:

[1] accumarray - The MathWorks http://www.mathworks.com/help/techdoc/ref/accumarray .html

[2] 向量化操作的又一重要函数accumarray的用法总结http://www.simwe.com/forum/thread-811616-1-3.html

[3] rocwood关于寻找完全数的程序

第一种:

clear;clc;close all

a=1:10000;

a(2*a'==accumarray(a',a',[],@(x)sum(a(abs(x./(1:x)-round(x./(1:x)))<eps))));