【问题标题】:Taking coords from Google Maps and inserting it in PostgreSQL从 Google Maps 获取坐标并将其插入 PostgreSQL
【发布时间】:2015-01-02 16:29:59
【问题描述】:

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

【问题讨论】:

  • 你知道SQL Injection是什么吗?您的代码很容易被操纵,从而将整个数据库暴露给攻击者。
  • 你有什么建议?
  • 构建查询的正确方法取决于您使用的框架。只是谷歌%my_sql_framework% pass parameters to sql query的例子。
  • 我已经发布了一个答案,解释了如何避免 sql 注入和创建正确的数据类型。接受的答案是抄袭我在 gis.stackexchange.com 上对您的评论。

标签: java android postgresql gis postgis


【解决方案1】:

正如 Igor 在 cmets 中指出的那样,您将字符串连接到 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 相比,您可以使用 ST_MakePoint 作为连接文本值的更简单版本。

并且,为了回答最初的问题,类型应该是几何,但如果您只使用特定几何类型,则可以更明确地说明,如果您正在工作,还可以添加空间参考 ID (SRID)带有一个,它将作为列上的约束,例如,

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

只允许您插入点和纬度/经度。也可以设置为POLYGONMUTLIPOLYGONLINESTRING等。如果你想更宽松,你可以这样做,

 CREATE table sometable (id serial, geom geometry);

另一种选择是使用AddGeometryColumn,它再次允许显式声明几何类型和SRID,并且还添加到元数据视图geometry_columns。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多