因为我只储存格点数据(栅格数据),其实就是坐标和值这两部分。一开始我尝试用mysql的point类,可以储存将经纬度坐标作为一个整体储存起来,还是很好用的,方便进行运算。但是因为数据条数数目巨大,为了减少空间,用两个float储存占得空间大小我发现更小,于是我一股脑的把所有坐标都分成经度和纬度两个浮点型全都存进去了。

这两天开始要加入空间分析功能了,找了个最简单的within试了一下,发现个问题,within(a1,a2),例子中select polygon from NDVI.`2015` where st_within(GeoFromText('Point(3,4)'),polygon);通过寻找包含固定点的多边形,来确认点是不是在多边形内部。而我是想要寻找多边形内的点,举个例子,寻找某省内部的说有点。突然就蒙了,我是两个值啊,套路不对啊。。。这可咋整,这么多数据还得重新录?我分别试用了select lat,lon from NDVI.`2015` where st_within(lat,lon,GeoFromText('polygon(0 0, 0 90,90 90,90 0 ,0 0)'));还有select lat,lon from NDVI.`2015` where st_within(‘point(lat,lon)',GeoFromText('polygon(0 0, 0 90,90 90,90 0 ,0 0)'));这两种都不行。。。好吧,这个时候确实特别蠢,于是我想,那就再加一行point类吧,好在数据都插入了,剩下的简单了吧。

正文来了~

1、

添加到某列后面

ALTER TABLE `database`.`new_table` ADD COLUMN `pnt` POINT NULL AFTER `date`;

将pnt添加到表database中date的后面 其中point类型不能勾选 NOT NULL,所以这里为NULL

如果想将某列添加为第一列

ALTER TABLE `database`.`new_table` ADD COLUMN `le` FLOAT NOT NULL FIRST;
ALTER TABLE `database`.`new_table` ADD COLUMN `bc` POINT NULL FIRST;

这两条我都试了,第一条没问题,第二条不止为什么不行,难道是POINT不能做第一列?

2、添加完列了之后开始用经纬度这两列合成新的一列吧

update new_table set pnt=point(la,lo)

la,lo是原来的经纬度列,pnt是新建的point类的列,new_table是表名

假如你想做简单的运算,比如加法

update new_table set pnt=la+lo

当然这其中pnt的类型肯定不能point了,得跟la+lo类型相同~

3、按说我前两部完成后我就不需要写第三条了,按照文章开头的例子改一下就行了,但是我就是想试试,感觉肯定别的大神得有办法,不能像我这么蠢,于是我就尝试着敲了下面的代码

select lat,lon,val from NDVI.`2015` where st_within(point(lat,lon),GeomFromText('POLYGON((125.1892 49.8175,125.2222 49.7955,125.2222 49.6692,122.4097 ,125.1892 49.8175)
 )'));

请忽略polygon后面的那几个数字,原文还要多出来一堆点,我删了就剩这几个,理解一下,就是个多边形哈哈。没错,这个就是把文章开头的尝试的第二种的引号去掉了,就成了~自己当初真是蠢。。。

好了,这样就就实现了分别用经度和纬度来进行空间运算了,不用改数据库了,当时还跟经理信誓旦旦的说经度和纬度直接存储占地小,能实现所有功能,哈哈,还好没打脸~


记录所学所用,包括但不限于遥感、地信、气象、生态环境,机器学习知识,相关文献阅读,编程代码实现。偶尔荒腔走板的聊聊其他。