2014-11-06 50 views
0

我的問題很基本。我正在使用Android Google Maps將座標從地圖上的某個位置移開,並且我想將其插入到PostgreSQL數據庫中。我知道我必須使用PostGIS,但我該怎麼做?誰能指出我正確的方向?從Google地圖中取出座標並將其插入到PostgreSQL中

在Java中我插入查詢看起來像:

String query = "INSERT INTO modul (denumire, adresa, tip_retea, geom, poza)"; 
query += " VALUES ('" 
    + getset.getDenumire() + "', '" 
    + getset.getAdresa() + "', '" 
    + getset.getTipretea()+ "', 
    ST_PointFromText('point(" + point.getX() + " " + point.getY()+ ")', 1), '" 
    + getset.getImagine() + "');"; 

產生了我下面的查詢:

INSERT INTO modul (denumire, adresa, tip_retea, geom, poza) VALUES ('', '', '', ST_PointFromText('point(23.78977 44.320948)', 1), 'irrelevant b64 encoded image'); 

但我怎麼能正確地插入座標轉換爲數據庫?列'geom'需要是什麼數據類型?先謝謝你。

+0

你知道SQL注入是什麼嗎?您的代碼可以很容易地被操縱,將整個數據庫暴露給攻擊者。 – 2014-11-06 11:31:23

+0

你有什麼建議? – MrSilent 2014-11-06 11:34:46

+0

構建查詢的正確方法取決於您使用的框架。只是谷歌的示例'%my_sql_framework%傳遞參數到sql查詢'。 – 2014-11-06 11:37:37

回答

2

正如Igor在評論中指出的那樣,將字符串連接到SQL語句的方法對SQL注入是開放的。您可以通過在Java中使用預準備語句來避免此問題。

//prepare a statement -- omitting the non geometry values from OP question for clarity 
String sql = "Insert into modul (geom) values (ST_MakePoint(?, ?))"; 
PreparedStatement stmt = conn.prepareStatement(sql); 
//add the actual x and y values 
stmt.setFloat(1, x); 
stmt.setFloat(2, y); 
stmt.executeUpdate(); 

注意您可以使用ST_MakePoint爲比使用ST_PointFromText串聯文本值的更簡單的版本。

而且,要回答原始問題,類型應該是幾何圖形,但如果僅使用特定的幾何類型,並且還可以添加空間參考ID(SRID),則可以使其更明確與一個工作,這將作爲列的約束,例如,

CREATE table sometable (id serial, geom geometry(POINT, 4326)); 

將只允許您插入點和緯度/經度。如果你想更寬鬆您也可以設置爲POLYGONMUTLIPOLYGONLINESTRING,等等,你可以做,

CREATE table sometable (id serial, geom geometry); 

另一種替代方案是使用AddGeometryColumn這又允許明確狀態幾何類型和SRID,並且還添加到元數據視圖geometry_columns。

相關問題