shp转txt获取其坐标点
1.shp->json
这样做可以获取 shp 文件每个面的组成顶点的坐标。转换方式为登陆该网址在线批量转换。https://mapshaper.org/
Json 格式如下:
其中单独一个面的表示如下,前面有声明所绘制的属性为面,后面描述了该面的属性,是 shp 文件中的字段。中间则是表示组成该面的顶点坐标,用【】将坐标框起来。
2.json->txt
但是我们如果只需要坐标不需要这些属性的话,可以对字符串处理将其进行分割。处理后结果如下:
其中第一个顶点坐标与最后一个顶点坐标为同一个坐标。
以下代码的功能是将一个string分割为许多小的string,并去除分隔符。这里的分隔符pattern可以自行设置。
vector<string> split(string str, string pattern)
{
string::size_type pos;
vector<string> result;
str += pattern;//扩展字符串以方便操作
int size = str.size();
for (int i = 0; i<size; i++)
{
pos = str.find(pattern, i);
if (pos<size)
{
std::string s = str.substr(i, pos - i);
result.push_back(s);
i = pos + pattern.size() - 1;
}
}
return result;
}
3.批量转换
对于批量处理,可以获取当前文件夹下所有格式为json的文件名,然后分别对每个文件执行转换操作,达到批量转换
获取当前文件夹下的所有格式为json的文件名:
- 批量获取当前文件夹下固定格式文件名
头文件:
#include <windows.h>
#include <io.h>
void GetAllFormatFiles(string path, vector<string>& files, string format)
{
//文件句柄
long hFile = 0;
//文件信息
struct _finddata_t fileinfo;
string p;
if ((hFile = _findfirst(p.assign(path).append("\\*" + format).c_str(), &fileinfo)) != -1)
{
do
{
if ((fileinfo.attrib & _A_SUBDIR))
{
if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
{
//files.push_back(p.assign(path).append("\\").append(fileinfo.name) );
GetAllFormatFiles(p.assign(path).append("\\").append(fileinfo.name), files, format);
}
}
else
{
files.push_back(p.assign(fileinfo.name));
}
} while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}
//获取该路径下所有json文件的绝对路径名
vector<string> readAllFiles(string filePath)
{
vector<string> files;
string format = ".json";
GetAllFormatFiles(filePath, files, format);
int size = files.size();
//cout << size << endl;
for (int i = 0; i<size; i++)
{
files[i] = filePath + "/" + files[i];//改为绝对路径
cout << files[i] << endl;//输出到屏幕
}
return files;
}
-
循环读取文件路径并执行转换操作。
转换操作就是在split函数的基础上自己设置分隔符操作即可。 -
程序
如果不想写也可以用我用qt写的简单小程序(好吧我就是为了积分~)
https://download.csdn.net/download/lemon_haha/11175744 选择文件夹后关闭即可。
注意:本程序仅在windows平台下测试通过,且json由shp转换而来,其中shp没有任何其它属性,所以设置的固定的分割符,可以满足大部分无属性简单json转换,但不一定适用于所有json文件。
不过也没事,若是不满足条件也可以基于以上程序自己设置分隔符即可。
最后生成结果如下: