我在MacOSX上使用Postgres 9.3。
如果有人能指出我在这里正确的方向,我会很高兴。我想编写一个连接到现有(在线)数据库(例如this one)并使用带有适当字符串的输入文件(在本例中为MRGID)检索数据(在本例中为shapefile)的函数。对不起,我没有任何代码,我真的不知道从哪里开始,我似乎没有找到任何线程。也许SQL
不是要去的地方?
输入文件示例;
species,mrgids
Sp1,4279
Sp1,8366
Sp1,21899
Sp1,21834
Sp1,7130
Sp1,1905
Sp1,21900
Sp1,5679
Sp1,5696
谢谢!
答案 0 :(得分:2)
这几乎肯定是在数据库之外最好的,使用您选择的语言的脚本。我使用Python和psycopg2,但Ruby + Pg gem,Perl和DBI / DBD :: Pg,甚至PHP和PDO等都是同样合理的选择。
您的代码可以执行HTTP提取,然后(如果它类似于CSV)使用COPY
命令将数据加载到PostgreSQL中。如果它是shapefile,您可以将数据提供给PostGIS的shp2pgsql
加载程序,或使用INSERT
PostGIS功能创建单独的GeomFromText
。
你可以从PL / Pythonu或PL / Perlu存储过程中进行HTTP提取,但是从脚本中执行它并没有什么好处,而且它作为外部脚本会更健壮。 / p>
所以,真的,你需要解决这个问题。
您需要使用代码与感兴趣的网站进行对话,可能包括提交表单的HTTP POST等内容。或者,最好使用web API作为为自动脚本化交互而设计的站点。使用Perl的LWP,Python的httplib等库,脚本语言可以很容易地使用大多数简单的RESTful API。对于您链接到的网站,如user623952提到的那样,有一个RESTful API。
然后你需要代码来获取感兴趣的数据,然后编写代码来读取获取的数据并将其加载到PostgreSQL中。您可能希望下载所有数据然后加载它,或者您可能希望在下载时将其流式传输到数据库中(管道传输到shp2pgsql
等)。
答案 1 :(得分:1)
这是PHP和CURL的一个非常基本的例子
我完全使用了输入文件并将其保存为input.txt
species,mrgids
Sp1,4279
Sp1,8366
Sp1,21899
Sp1,21834
Sp1,7130
Sp1,1905
Sp1,21900
Sp1,5679
Sp1,5696
这是 PHP和CURL 做的事情:
<?php
$base_url = "http://www.marineregions.org/rest/getGazetteerRecordByMRGID.json/%s/";
// just get the input file into an array to use
$csv = read_file("input.txt");
// if you want to see the format of $csv
print "<pre>".print_r($csv,true)."</pre>";
// go through each csv item and run a curl request on it
foreach($csv as $i => $data)
{
$mrgids = $data['mrgids'];
$url = sprintf($base_url,$mrgids);
$response = run_curl_request($url);
if ($response!==false)
{
//http://us2.php.net/manual/en/function.json-decode.php
$json = json_decode($response,true);
if (!is_null($json))
{
// this is where you would write the code to stick this info in
// your DB or do whatever you want with it...
print "<pre>$url \n".print_r($json,true)."\n\n</pre>";
}
else
{
print "error: response was not proper JSON for $url <br/><br/>";
print $response."<br/><br/><br/>";
}
}
else
{
print "error: response was false for $url <br/><br/>";
}
}
function read_file($filename, $has_headers=true, $assoc=true)
{
$headers = array();
$row = 1;
if (($handle = fopen($filename, "r")) !== FALSE)
{
$return = array();
if ($has_headers)
{
if (($data = fgetcsv($handle, 1000, ",")) !==false)
{
$headers = $data;
}
}
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE)
{
if ($assoc)
{
$temp = array();
foreach($headers as $hi => $header)
{
$temp[$header] = (isset($data[$hi])) ? $data[$hi] : '';
}
$return[] = $temp;
}
else
{
$return[] = $data;
}
}
fclose($handle);
}
else
{
$return = false;
}
return $return;
}
// requires PHP CURL extension
// http://php.net/manual/en/function.curl-setopt.php
function run_curl_request($url)
{
// create curl resource
$ch = curl_init();
$defaults = array(
CURLOPT_POST => false,
CURLOPT_HEADER => false,
CURLOPT_URL => $url,
CURLOPT_FRESH_CONNECT => true,
CURLOPT_FAILONERROR => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FORBID_REUSE => true,
CURLOPT_TIMEOUT => 4
);
curl_setopt_array($ch, $defaults);
// $output contains the output string
$output = curl_exec($ch);
// close curl resource to free up system resources
curl_close($ch);
return $output;
}
?>
如果它有效,你会得到一堆这样的输出:
http://www.marineregions.org/rest/getGazetteerRecordByMRGID.json/4279/
Array
(
[MRGID] => 4279
[gazetteerSource] => IHO 23-3rd: Limits of Oceans and Seas, Special Publication 23, 3rd Edition 1953, published by the International Hydrographic Organization.
[placeType] => IHO Sea Area
[latitude] => 39.749996185303
[longitude] => 5.0942182540894
[minLatitude] => 35.071937561035
[minLongitude] => -6.0326728820801
[maxLatitude] => 44.42805480957
[maxLongitude] => 16.221109390259
[precision] => 1079464.0796258
[preferredGazetteerName] => Mediterranean Sea - Western Basin
[preferredGazetteerNameLang] => English
[status] => standard
[accepted] => 4279
)
备注:强>