mysql - 将圆存储在 MySQL 地理空间数据库中

标签 mysql gis geospatial

我希望能够使用固定的点 g半径 d 存储圆,然后在检索信息时取回这些值。

我发现使用这些参数创建地理对象的唯一方法是使用生成多边形的缓冲区:

https://dev.mysql.com/doc/refman/5.6/en/spatial-operator-functions.html#function_buffer

SELECT ASTEXT( BUFFER ( POINT( 10, 10 ), 5 ) );

| POLYGON((10 0,9.50932325672582 0.012045437948275506,9.019828596704395 0.048152733278032045,8.532695255446383 0.10823490035219052,8.049096779838717 0.1921471959676957,7.570198200967361 0.2996874680545609,7.097153227455378 0.4305966426779104,6.631101466077799 0.5845593481697922,6.173165676349102 0.7612046748871322,5.724449065697179 0.9601070687655664,5.286032631740024 1.1807873565164506,4.858972558067784 1.4227138999972784,4.444297669803978 1.6853038769745474,4.043006955075667 1.9679246851935517,3.6560671583635447 2.2698954663726303,3.2844104515298165 2.5904887464504087,2.9289321881345254 2.9289321881345254,2.5904887464504087 3.2844104515298165,2.2698954663726303 3.6560671583635447,1.9679246851935517 4.043006955075667,1.6853038769745474 4.444297669803978,1.4227138999972784 4.858972558067784,1.1807873565164506 5.286032631740024,0.9601070687655664 5.724449065697179,0.7612046748871322 6.173165676349102,0.5845593481697922 6.631101466077799,0.4305966426779104 7.097153227455378,0.2996874680545609 7.570198200967361,0.1921471959676957 8.049096779838717,0.10823490035219052 8.532695255446383,0.048152733278032045 9.019828596704395,0.012045437948275506 9.50932325672582,0 10,0.048152733278032045 10.980171403295605,0.10823490035219052 11.467304744553617,0.1921471959676957 11.950903220161283,0.2996874680545609 12.429801799032639,0.4305966426779104 12.902846772544622,0.5845593481697922 13.368898533922202,0.7612046748871322 13.826834323650898,0.9601070687655664 14.27555093430282,1.1807873565164506 14.713967368259976,1.4227138999972784 15.141027441932216,1.6853038769745474 15.555702330196022,1.9679246851935517 15.956993044924333,2.2698954663726303 16.343932841636455,2.5904887464504087 16.715589548470184,2.9289321881345254 17.071067811865476,3.2844104515298165 17.409511253549592,3.6560671583635447 17.73010453362737,4.043006955075667 18.03207531480645,4.444297669803978 18.314696123025453,4.858972558067784 18.577286100002723,5.286032631740024 18.81921264348355,5.724449065697179 19.039892931234434,6.173165676349102 19.238795325112868,6.631101466077799 19.41544065183021,7.097153227455378 19.569403357322088,7.570198200967361 19.70031253194544,8.049096779838717 19.807852804032304,8.532695255446383 19.89176509964781,9.019828596704395 19.95184726672197,9.50932325672582 19.987954562051726,10 20,10.49067674327418 19.987954562051726,10.980171403295605 19.95184726672197,11.467304744553617 19.89176509964781,11.950903220161283 19.807852804032304,12.429801799032639 19.70031253194544,12.902846772544622 19.569403357322088,13.368898533922202 19.41544065183021,13.826834323650898 19.238795325112868,14.27555093430282 19.039892931234434,14.713967368259976 18.81921264348355,15.141027441932216 18.577286100002723,15.555702330196022 18.314696123025453,15.956993044924333 18.03207531480645,16.343932841636455 17.73010453362737,16.715589548470184 17.409511253549592,17.071067811865476 17.071067811865476,17.409511253549592 16.715589548470184,17.73010453362737 16.343932841636455,18.03207531480645 15.956993044924333,18.314696123025453 15.555702330196022,18.577286100002723 15.141027441932216,18.81921264348355 14.713967368259976,19.039892931234434 14.27555093430282,19.238795325112868 13.826834323650898,19.41544065183021 13.368898533922202,19.569403357322088 12.902846772544622,19.70031253194544 12.429801799032639,19.807852804032304 11.950903220161283,19.89176509964781 11.467304744553617,19.95184726672197 10.980171403295605,19.987954562051726 10.49067674327418,20 10,19.95184726672197 9.019828596704395,19.89176509964781 8.532695255446383,19.807852804032304 8.049096779838717,19.70031253194544 7.570198200967361,19.569403357322088 7.097153227455378,19.41544065183021 6.631101466077799,19.238795325112868 6.173165676349102,19.039892931234434 5.724449065697179,18.81921264348355 5.286032631740024,18.577286100002723 4.858972558067784,18.314696123025453 4.444297669803978,18.03207531480645 4.043006955075667,17.73010453362737 3.6560671583635447,17.409511253549592 3.2844104515298165,17.071067811865476 2.9289321881345254,16.715589548470184 2.5904887464504087,16.343932841636455 2.2698954663726303,15.956993044924333 1.9679246851935517,15.555702330196022 1.6853038769745474,15.141027441932216 1.4227138999972784,14.713967368259976 1.1807873565164506,14.27555093430282 0.9601070687655664,13.826834323650898 0.7612046748871322,13.368898533922202 0.5845593481697922,12.902846772544622 0.4305966426779104,12.429801799032639 0.2996874680545609,11.950903220161283 0.1921471959676957,11.467304744553617 0.10823490035219052,10.980171403295605 0.048152733278032045,10.49067674327418 0.012045437948275506,10 0)) |

1 row in set (0.00 sec)

我的问题是,将来选择此行时我无法检索点和半径,而是取回多边形。

是否没有更好的方法来存储与 MySQL GeoSpatial Extensions 一起使用的圆?

最佳答案

空间数据库不擅长存储曲线;相反,它们往往由许多直线段来近似,因此您实际上并没有保留圆。对弯曲几何形状的支持正在改进,但还没有真正实现。

我可能会像您一样存储几何图形,以及将半径存储为浮点值。

或者,如果您只想存储几何图形,则可以使用 Centroid 获取多边形(“圆”)的中心。函数,然后通过将多边形转换为直线并确定质心与直线之间的距离来获得半径。还有其他方法可以确定这个距离。需要注意的是,因为这只是一个圆的近似值,所以当在中心和一个顶点之间测量时,以及从中心和两个顶点之间的边缘测量时,圆心与其边缘之间的距离是不同的。因此,如果您不独立于几何体存储半径,理想情况下您应该测量顶点和中心之间的距离,该距离等于原始半径(缓冲区距离)。实际上,只要您的“圆”具有密集的顶点,差异就会相当小。

关于mysql - 将圆存储在 MySQL 地理空间数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37080223/

相关文章:

sql - 在 MySQL 中创建/写入权限

windows - 在 Windows 上使用 osm2pgsql default.style 文件

ruby - 在 Ubuntu 上安装 proj4rb : Cannot find proj_api. h header

mongodb - 盒内地理空间查询中的 Mongoose 无法正常工作

r - 使用 GEOJSON_WRITE 在 R 中创建 GEOJSON 文件

javascript - 使用 id 从表中删除特定行并使用 Jquery Ajax php mysql 在后台刷新同一个表

mysql : adding days to a date

php - 我如何使用 Jquery EasyUI 将我的文件上传到 DB mysql?

python - GDAL Python 创建轮廓线

sql-server-2008 - 选择具有大多边形的良好 SQL Server 2008 空间索引