简述

epsg.io是一个查询EPSG坐标系相关信息的好网站,内容很全。有各种格式的定义可以直接下载,也有坐标系的范围名称等相关信息,所以想抓取这些信息下来,方便对接各个系统。

epsg.io本身是开源的,代码在https://github.com/klokantech/epsg.io上,但是这个我分析出数据来源,应该是在epsg.io/gml/gml.sqlite文件中,但是我打开这个文件发现没有相关的记录。

抓取说明

抓取的时候使用的是proj4项目里的nad/epsg文件中的记录作为索引,找到对应的epsg代码去拼成对应url去下载。

下面是代码,用的是libcurl进行的相关操作。日志记录简单的用了一下glog,可以去掉,去掉之后就是纯C的代码了。

抓取的结果直接写在程序目录下的epsg.io目录下,请先创建好这个目录。

保存的html文件的解析,可以参考HTML解析库Gumbo简单使用记录

抓取好的文件可以在这里epsg.io.7z下载,解压压缩之后会有三百多兆,共5754个文件。

分析后提取的内容,生成了一个超大的JSON文件,可以再这里epsg.io.json.7z下载。


我把抓取的内容处理成json后,又将其导入了MongoDB数据库。

这里将数据备份后上传在这里https://files.cnblogs.com/files/oloroso/epsg.io.mongodb.7z,这个数据可以直接使用mongorestore工具恢复到数据库。

导入MongoDB的数据中,wgs84_bound字段名改为84boxproj_bound字段改为projbox,中心点坐标经过处理,不会有null出现。

代码

// g++ epsg.spider.cpp -o epsg.spider -lcurl  -lglog -lpthread
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <curl/curl.h>
#include <glog/logging.h> int downpage(int epsgcode)
{
int ret = 0;
char url[1024];
sprintf(url,"./epsg.io/%d.html",epsgcode);
FILE* fp = fopen(url,"wb");
if(fp == NULL){
fprintf(stderr,"\n创建输出文件失败i\n");
ret = -1;
return ret;
} sprintf(url,"http://epsg.io/%d",epsgcode);
CURL *hnd = curl_easy_init();
curl_easy_setopt(hnd, CURLOPT_CUSTOMREQUEST, "GET");
curl_easy_setopt(hnd, CURLOPT_URL, url);
curl_easy_setopt(hnd, CURLOPT_COOKIEFILE, "./epsg.spider.cookie");
//curl_easy_setopt(hnd, CURLOPT_COOKIE, cookie_buffer); curl_easy_setopt(hnd, CURLOPT_WRITEDATA, fp); CURLcode res = (CURLcode)curl_easy_perform(hnd);
if(res != CURLE_OK) {
fprintf(stderr,"\n%s curl_easy_perform failed:%s\n",url,curl_easy_strerror(res));
ret = -2;
}
fclose(fp);
curl_easy_cleanup(hnd);
return ret;
} int main(int c,char** v)
{
// 打开epsg文件
FILE* fp = fopen("epsg","r");
if(fp == NULL){
puts("open epsg fiaild");
return 0;
}
google::InitGoogleLogging(v[0]);
FLAGS_log_dir = "."; /*
* 这个函数只能用一次,如果这个函数在curl_easy_init函数调用时还没调用,
* 它讲由libcurl库自动调用,所以多线程下最好在主线程中调用一次该函数以防止在线程
* 中curl_easy_init时多次调用
*/
curl_global_init(CURL_GLOBAL_ALL); char s[4096]; puts("开始下载:");
while(!feof(fp) && limit > 0){
int epsgcode = 0;
static char name[1024];
static char proj[1024];
fgets(s,sizeof s,fp);
if(s[0] == '#' ){
sscanf(s,"# %[^\n]s",name);
}
sscanf(s,"<%d> %[^\n<]s",&epsgcode,proj);
if(epsgcode == 0){
continue;
}
char path[128];
sprintf(path,"./epsg.io/%d.html",epsgcode);
struct stat st;
if(stat(path,&st) == 0) {
if(st.st_size > 1024){
// printf("%5d %s exsits\n",epsgcode,path);
continue;
}
} printf("\r正在下载:http://epsg.io/%d ",epsgcode);
LOG(INFO) << "begin download http://epsg.io/"<<epsgcode;
if( downpage(epsgcode) != 0){
break;
}
LOG(INFO) << "finish download http://epsg.io/"<<epsgcode;
} //在结束libcurl使用的时候,用来对curl_global_init做的工作清理。类似于close的函数
curl_global_cleanup(); fclose(fp);
return 0;
}

抓取epsg.io的内容的更多相关文章

  1. python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息,抓取政府网新闻内容

    python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息PySpider:一个国人编写的强大的网络爬虫系统并带有强大的WebUI,采用Python语言编写 ...

  2. C#抓取AJAX页面的内容

    原文 C#抓取AJAX页面的内容 现在的网页有相当一部分是采用了AJAX技术,所谓的AJAX技术简单一点讲就是事件驱动吧(当然这种说法可能很不全面),在你提交了URL后,服务器发给你的并不是所有是页面 ...

  3. php抓取网页中的内容

    以下就是几种常用的用php抓取网页中的内容的方法.1.file_get_contentsPHP代码代码如下:>>>>>>>>>>>&g ...

  4. Java 抓取网页中的内容【持续更新】

    背景:前几天复习Java的时候看到URL类,当时就想写个小程序试试,迫于考试没有动手,今天写了下,感觉还不错 内容1. 抓取网页中的URL 知识点:Java URL+ 正则表达式 import jav ...

  5. 【新手向】使用nodejs抓取百度贴吧内容

    参考教程:https://github.com/alsotang/node-lessons 1~5节 1. 通过superagent抓取页面内容 superagent .get('http://www ...

  6. 还没被玩坏的robobrowser(4)——从页面上抓取感兴趣的内容

    背景 本节的知识实际上是属于Beautiful Soup的内容. robobrowser支持Beautiful Soup,一般来说通过下面3个方法获取页面上感兴趣的内容 find find_all s ...

  7. python3抓取淘宝评论内容

    好久没有写爬虫了,今天研究了下淘宝商品评论的内容. 一开始用最简单的方法,挂代理,加请求头,对网页请求,是抓不到数据的,在网上找了一些相关文章,也基本已经过时了,就是网站逻辑有改动,用旧的方法是抓不到 ...

  8. 用C#抓取AJAX页面的内容

    现在的网页有相当一部分是采用了AJAX技术,不管是采用C#中的WebClient还是HttpRequest都得不到正确的结果,因为这些脚本是在服务器发送完毕后才执行的! 但我们用IE浏览页面时是正常的 ...

  9. sax 动态切换 抓取感兴趣的内容(把element当做documnet 处理)

    由switch 类触发事件 import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.hel ...

随机推荐

  1. 使用gunicorn将django项目部署到生产环境的子目录下,在nginx后端获取客户真实IP地址

    生产环境有时,并不是为了一个项目而存在的.毕竟,域名是比较稀有的. 今天遇到这个问题,解决了.作个记录. 并且,如果将django项目部署在Nginx后面,那如何获取用户真实的IP地址呢? 下面就来解 ...

  2. 国内最火5款Java微服务开源项目

    目录 1.pig 2.zheng 3.Cloud-Platform 4.SpringBlade 5.Guns 1.pig 开源地址:https://gitee.com/log4j/pig 基于Spri ...

  3. php输出json的内容

    $json = '{"foo": 12345}'; $obj = json_decode($json); print $obj->{'foo'}; // 12345

  4. day9线程和进程

    进程:qq要以一个整体的形式暴露给操作系统管理,里面包含对各种资源的调用,内存的对各种资源管理的集合,就可称之为进程. 线程:是操作系统最小的调度单位,是一串指令的集合. 进程:要操作CPU,必须要先 ...

  5. python全栈开发day18-模块和导入

    1.昨日内容回顾 2.模块和模块导入 1.什么是模块,为什么要模块? py文件就是模块, 把相似的功能放到一个文件,要用的时候 引入就可以直接调用了. import py文件名,导入模块就是执行他的代 ...

  6. 094实战 关于js SDK的程序,java SDK的程序

    一:JS SDK 1.修改配置workspace 2.导入 3.Demo.html <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Trans ...

  7. Camera摄像头

    <LinearLayout android:id="@+id/btn_layout" android:layout_width="match_parent" ...

  8. Jetbrains 2018 等系列软件激活破解除去黄色警告框方法(含多个平台)

    现在以IDEA 2018软件在windows为例进行讲解破解方法,其它软件及其在不同平台的破解方法原理 大同小异,有需要的有兴趣的可以尝试一下. 最近更新了Intellij IDEA到2018.1.5 ...

  9. jvm本地实战

    前言 ​ 由于上次线上full gc,让我这个没有机会实战接触jvm的人,尝到了一定的甜头,同时也觉得自己还有很多东西需要去实战并总结.这是一篇记录jvm配置参数,使用jvisualvm工具来让人对j ...

  10. IdentityServer4-介绍

    一.总体介绍 大多数现代应用或多或少是这样的: 通常,每个层(前端.中间层和后端)都必须保护资源并实现身份验证和/或授权——通常针对相同的用户存储. 将这些基本的安全功能外包给安全令牌服务,可以防止在 ...