在maps api v3上绘制一个多边形并将其保存到postgresql几何列

时间:2014-09-09 21:34:34

标签: php postgresql google-maps-api-3

1.-用户在网络应用中绘制多边形。

2.-当用户点击“保存”时,我想将数据保存在postgresql DB中。

我遇到了多边形坐标问题......

POLYGON协调文本领域的价值观,它看起来像这样:

(13.068776734357694,-65.50735473632812),(6.795535025719505,-62.123565673828125),(7.928674801364048,-70.78079223632812)

当用户在地图上绘图时,我得知他们

google.maps.event.addListener(drawingManager,'polygoncomplete',function(polygon) {

// complete functions
var coordinates = (polygon.getPath().getArray());
$("#coordinates").val(coordinates);

});

SO FAR SO GOOD,当我在表单中传递这些值并尝试将它们保存在DB中时,我收到了此错误:

致命错误:未捕获的异常' PDOException'消息' SQLSTATE [XX000]:内部错误:7错误:解析错误 - 无效几何提示:"(1"< - 解析几何中位置2的错误' in

PHP

$stmt = $link->prepare("INSERT INTO industrias.industrias (rif,nombre,geom) VALUES (:rif,:nombre,:coor)");
$stmt->execute(array(':rif'=>$_POST["rif"],':nombre'=>$_POST["nombre_empresa"],':coor'=>$_POST["coordinates"]));

问题1:

还有其他任何函数可以使这些坐标符合列类型 geometry(Polygon,4326)的其他模式吗?

问题2:

我可以在SQL STATEMENT中使用一些postgis函数来使其工作吗?与WKT或其他什么东西?

1 个答案:

答案 0 :(得分:0)

我做了一个地理围栏模块,我在数据库中保存了很多形状。 我没有像那样保存协调。

我使用google encoding algorithem编码多边形和多边形线的路径,然后将编码后的字符串保存在数据库中。

https://developers.google.com/maps/documentation/javascript/examples/geometry-encodings

圆圈可以保存为lat,lon和radius。

从长远来看,这将是简单而稳定的解决方案。

如果您需要坐标,只需使用谷歌api编码功能解码它们。

更新

我无法将该应用程序显示为违反我的公司政策,但有些代码片段可以帮助您:

完成绘图时

google.maps.event.addDomListener(drawingManager, 'polygoncomplete', function(polygon) {      
          drawingManager.setDrawingMode(null); // disable drawing mode
          CreateCourseRegionPoly(polygon);          
      });

我在下面使用休息服务保存在数据库中(注意编码uri,因为一些有趣的字符可以出现在编码中):

function CreateCourseRegionPoly(poly){
var polypath= poly.getPath();
var encodeString = google.maps.geometry.encoding.encodePath(polypath); 
   $.ajax({
      url: '../RestApi/CreateRegion',
      type: 'POST',
      contentType: 'application/json',
      cache: false,
      dataType: 'json',          
      data: '{"CourseID":"'+ courseID +'","PolygonPath":"'+encodeURIComponent(encodeString)+'"}',
      error: function (jqXHR, textStatus, errorThrown) {
        alert("Messaging failed: " + errorThrown);
      },
       success: function (data) {
       //d oyour sucess bit here...
       }
    });
}