Java 从谷歌地图中获取坐标并将其插入PostgreSQL

Java 从谷歌地图中获取坐标并将其插入PostgreSQL,java,android,postgresql,gis,postgis,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()

我的问题很基本。我正在使用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”列需要什么数据类型?提前感谢您。

正如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_PointFromText相比,您可以将其用作连接文本值的更简单版本

为了回答最初的问题,类型应该是几何体,但如果您仅使用特定的几何体类型,则可以使其更明确,如果您使用空间参照ID(SRID),则还可以添加空间参照ID(SRID),该ID将用作柱上的约束,例如

CREATE table sometable (id serial, geom geometry(POINT, 4326));
将仅允许您以lat/lon插入点和。您还可以将其设置为
多边形
多多边形
线字符串
,等等。如果您想更宽松,您可以这样做

 CREATE table sometable (id serial, geom geometry);

另一种选择是使用它,它同样允许显式地声明几何体类型和SRID,还可以添加到元数据视图几何体列。

您知道什么是
SQL Injection
?您的代码可以很容易地被操纵,从而将整个数据库暴露给攻击者。您有何建议?构建查询的正确方法取决于您使用的框架。只需在google上搜索
%my_sql\u framework%的示例,即可将参数传递给sql query
。我已经发布了一个答案,解释了如何避免sql注入并创建正确的数据类型。公认的答案是剽窃我在gis.stackexchange.com上对您的评论。