我的问题很基本。我正在使用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'需要什么数据类型?提前谢谢。
答案 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。您也可以将其设置为POLYGON
,MUTLIPOLYGON
,LINESTRING
等。如果您想要更加宽松,可以这样做,
CREATE table sometable (id serial, geom geometry);
另一种替代方法是使用AddGeometryColumn,它同样允许显式地声明几何类型和SRID,并且还添加到元数据视图geometry_columns。