2013-12-04 5 views
0

Im использует Postgres 9.3 на MacOSX.извлекает данные из онлайн-базы данных с использованием входного файла

Я был бы очень рад, если бы кто-нибудь мог указать мне в правильном направлении здесь. Я хотел бы написать функцию, которая соединяется с существующей (онлайн) базой данных (например, this one) и извлекает данные (в данном случае шейп-файлы), используя входной файл с соответствующими строками (в данном случае MRGID). Мне жаль, что у меня нет кода, я буквально не знаю, с чего начать, и я, кажется, не нахожу ни одного потока на нем. Может быть, SQL не может пойти сюда?

Пример входного файла;

species,mrgids 
Sp1,4279 
Sp1,8366 
Sp1,21899 
Sp1,21834 
Sp1,7130 
Sp1,1905 
Sp1,21900 
Sp1,5679 
Sp1,5696 

Спасибо!

+3

о, что сайт использует RESTful API, тоже ... использовать это ... 'HTTP: // WWW .marineregions.org/rest/getGazetteerRecordByMRGID.json/5696/'где' 5696' - это MRGID. [см. их документацию] (http://www.marineregions.org/gazetteer.php?p=webservices), они показывают много очень полезных примеров, если вы пройдете через все это. –

+0

Привет, я проверю это! –

ответ

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; 
} 


?> 

И если это сработает, вы получите ab УНЧ из них, как выхода:

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 
) 

Примечание:

+0

Большое спасибо за пример! Большая помощь. PHP совершенно для меня до сих пор ... –

+0

Ох ... ладно ... так что ты делаешь с этими данными? вставляя его в свою БД? обязательно используйте 'pdo' или' mysqli' ... и найдите такие сообщения: [PHP PDO пакетная вставка из многомерного массива, не вставляемого в MySQL] (http://stackoverflow.com/questions/13507496/) .. все с вставкой с ассоциативным массивом. вместо вывода массива на экран, вот где должна быть ваша вставка. чтобы упростить задачу, сделайте имена столбцов такими же, как имена полей. –

+0

Да, предположим, я бы использовал PostGIS и импортировал данные в мою базу данных Postgres. Тогда план состоит в том, чтобы использовать R для геостатистики. Я знаком с R, но я нашел [хорошую нить] (http://gis.stackexchange.com/questions/64950/which-is-the-best-way-of-working-with-postgis-data-in-r) на рабочий процесс от Postgres до R –

2

Это почти наверняка сделано лучше всего за пределами базы данных, используя скрипт по вашему выбору языка. Я бы использовал Python и psycopg2, но такие вещи, как Ruby + Pg gem, Perl и DBI/DBD :: Pg, или даже PHP и PDO, одинаково разумны.

Ваш код может выполнить выборку HTTP, а затем (если это CSV-подобный) использует команду COPY для загрузки данных в PostgreSQL. Если это шейп-файл, вы можете подать данные на загрузчик PostGISshp2pgsql или сделать индивидуальный INSERT с помощью функции PostGIS GeomFromText.

Вы можете сделать HTTP-выборку из хранимой процедуры PL/Pythonu или PL/Perlu, но не было никакой реальной выгоды от ее выполнения из сценария, и она была бы более надежной как внешний скрипт.

Итак, действительно, вам нужно разделить эту проблему.

Вам понадобится код, чтобы поговорить с интересующими вас веб-сайтами, возможно, включая такие вещи, как HTTP POST, чтобы отправлять формы. Или, предпочтительно, используйте сайт web API для сайтов (сайтов), предназначенных для автоматического взаимодействия по сценариям. Самые простые API-интерфейсы RESTful просты в использовании из языков сценариев, используя библиотеки, такие как LWP Perl, httplib Python и т. Д. В случае сайта, на который вы ссылались, упоминается user623952, есть RESTful API.

Затем вам понадобится код для извлечения интересующих данных и кода для чтения извлеченных данных и загрузки его в PostgreSQL. Возможно, вам захочется загрузить все данные, затем загрузить их, или вы можете поместить их в базу данных по мере ее загрузки (труба до shp2pgsql и т. Д.).

+0

Спасибо за указатели! Даже не знал о PostGIS. –

+0

@Jo У этого есть немного кривой обучения, но PostGIS будет спасателем, если вы работаете с географическими данными. Настоятельно рекомендуется. –

+0

Приветствия! Вероятно, хорошо сочетаются с различными библиотеками карт в R. –

Смежные вопросы