利用curl進行逆地理編碼_c語言編寫動態連結程式庫對PostgreSQL進行擴充

來源:互聯網
上載者:User

標籤:

流程:
【1】c語言編寫逆地理編碼的函數,利用curl庫和高德伺服器進行地理座標解析
【2】gcc產生動態連結程式庫
【3】postgreSQL中載入動態連結程式庫中的函數
【4】postgreSQL中將逆地理編碼函數的傳回型別進行轉化
===========================================
【1】c語言編寫逆地理編碼的函數,利用curl庫和高德伺服器進行地理座標解析

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <curl/curl.h>#include "postgres.h"#include "fmgr.h"PG_MODULE_MAGIC;int StringFind(const char *pSrc,const char *pDst)//字串位置尋找,返回源字串的位置 {      int i, j;      for (i=0; pSrc[i]!='\0'; i++)      {          if(pSrc[i]!=pDst[0])              continue;                 j = 0;          while(pDst[j]!='\0' && pSrc[i+j]!='\0')          {              j++;              if(pDst[j]!=pSrc[i+j])              break;          }          if(pDst[j]=='\0')              return i;      }      return -1;  }  size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata)//回呼函數{strcat((char*)userdata, (char*)ptr);return size*nmemb;}char* poi_list(char* longitude, char* latitude) {//主函數 int mPos=0; char* result; char* strLongitude=longitude; char* strLatitude=latitude; char tempLongitude[25]="longitude="; char tempLatitude[25]="&latitude="; char* pstrLongitude; char* pstrLatitude;  pstrLongitude=strcat((char*)tempLongitude,strLongitude); pstrLatitude=strcat((char*)tempLatitude,strLatitude); char* locationInfor=strcat(pstrLongitude,pstrLatitude); char finalResult[5120]={'\0'}; int  i=0; char* pDst="poi_list";  char szRet[5120] = {'\0'};//結果儲存 char  szpage[256] = "http://ditu.amap.com/service/regeo?"; char  *myurl =strcat(szpage,locationInfor); CURLcode res;  res = curl_global_init(CURL_GLOBAL_ALL);//初始化 if (res != CURLE_OK)     {         result = psprintf( "Failed to global init default [%d]\n", res );              return result;    }   CURL* pEasyHandle = curl_easy_init(); // 初始化 curl_easy_setopt(pEasyHandle, CURLOPT_URL, myurl);//傳入url curl_easy_setopt(pEasyHandle, CURLOPT_WRITEFUNCTION, &write_callback);//調用回呼函數 curl_easy_setopt(pEasyHandle, CURLOPT_TIMEOUT, 10);   curl_easy_setopt(pEasyHandle, CURLOPT_FORBID_REUSE, 1);    curl_easy_setopt(pEasyHandle, CURLOPT_WRITEDATA, szRet);//參數三對應回呼函數的參數四 res = curl_easy_perform(pEasyHandle); curl_easy_cleanup(pEasyHandle); result = szRet ;//擷取整個json資料 mPos=StringFind(result,pDst); int mNewPos=mPos+10;//過濾掉poi_list欄位 while(szRet[mNewPos]!='\0') {  finalResult[i]=szRet[mNewPos];  mNewPos++;  i++; }  i=i-2;  finalResult[i]='\0';  char *result0=finalResult;  return result0;}
【2】gcc產生動態連結程式庫
[email protected]:~/文檔/Curl_program$ gcc -fpic -I `pg_config --includedir-server` -c poiOutput.c -lcurl[email protected]:~/文檔/Curl_program$ gcc -fpic -shared -o poiOutput.so poiOutput.o -lcurl[email protected]:~/文檔/Curl_program$ sudo cp poiOutput.so `pg_config --libdir`
【3】postgreSQL中載入動態連結程式庫中的函數
gpsDB=# load 'poiOutput.so';LOADgpsDB=# create function poi_list(cstring,cstring)returns cstringas 'poiOutput.so','poi_list'language C immutable strict;CREATE FUNCTIONgpsDB=# select poi_list('118.744607','32.030886');
【4】postgreSQL中將逆地理編碼函數的傳回型別進行轉化【參數null::poiarray,其中poiarray表結構與json結構相對應,詳情點擊此處】
gpsDB=# select (select poi_list('112.931850','28.169100'))::json;ERROR:  cannot cast type cstring to json    ?//cstring類型轉化為text類型,再轉化為json類型gpsDB=# select * from json_populate_recordset(null::poiarray,(cast((select poi_list('118.744607','32.030886')) as text))::json);gpsDB=# select * from json_populate_recordset(null::poiarray,(poi_list('118.744607','32.030886')::text)::json);


利用curl進行逆地理編碼_c語言編寫動態連結程式庫對PostgreSQL進行擴充

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.