从Google Maps获取coords并将其插入PostgreSQL

时间:2014-11-06 08:29:58

标签: java android postgresql gis postgis

我的问题很基本。我正在使用Android Google Maps从地图上的某个位置获取坐标,我想将其插入到PostgreSQL数据库中。我知道我必须使用PostGIS,但我该怎么做?谁能指出我正确的方向?

我在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'需要什么数据类型?提前谢谢。

1 个答案:

答案 0 :(得分: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),则可以使其更加明确,如果您正在工作with one,它将作为列的约束,例如,

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

只允许你插入点和lat / lon。您也可以将其设置为POLYGONMUTLIPOLYGONLINESTRING等。如果您想要更加宽松,可以这样做,

 CREATE table sometable (id serial, geom geometry);

另一种替代方法是使用AddGeometryColumn,它同样允许显式地声明几何类型和SRID,并且还添加到元数据视图geometry_columns。