sql - 您是否设法在 MULTIPOLYGONS 上运行 STBuffer ?使用 SQL Server?
问题描述
在 SQL Server 地理空间中,我无法运行STBuffer
for MULTIPOLYGONS
。
DECLARE @g geography = geography::STMPolyFromText('MULTIPOLYGON(((1 1, 1 -1, -1 -1, -1 1, 1 1)),((1 1, 3 1, 3 3, 1 1)))', 4326);
SELECT @g -- no problem to run
SELECT @g.ToString() -- no problem to run
SELECT @g.STBuffer(1).ToString(); -- error
返回的错误是:
消息 6522,级别 16,状态 1,第 64
行在执行用户定义的例程或聚合“地理”期间发生 .NET Framework 错误:System.ArgumentException:24144:此操作无法完成,因为实例无效。使用 MakeValid 将实例转换为有效实例。请注意,MakeValid 可能会导致几何实例的点稍微移动。System.ArgumentException:
解决方案
我认为这是因为您创建的多边形不是有效的geography
多边形。尝试使用一组有效的纬度/经度值创建多多边形。
使用数据类型执行相同的代码geometry
似乎可行。
DECLARE @g geometry = geometry::STMPolyFromText('MULTIPOLYGON(((1 1, 1 -1, -1 -1, -1 1, 1 1)),((1 1, 3 1, 3 3, 1 1)))', 4326);
select
geoMultiPolys = @g,
geoMultiPolysString = @g.ToString(),
buffered = @g.STBuffer(1),
bufferedString = @g.STBuffer(1).ToString(),
IsValid = @g.STIsValid()
同样,这个适用于地理
DECLARE @g geography = geography::STMPolyFromText('MULTIPOLYGON (((40 40, 20 45, 45 30, 40 40)), ((20 35, 10 30, 10 10, 30 5, 45 20, 20 35), (30 20, 20 15, 20 25, 30 20)))', 4326);
select
geoMultiPolys = @g,
geoMultiPolysString = @g.ToString(),
buffered = @g.STBuffer(1),
bufferedString = @g.STBuffer(1).ToString(),
IsValid = @g.STIsValid()
推荐阅读
- flutter - Flutter Web:如何压缩图像/文件?
- chef-infra - 如何避免厨师独奏将文件从站点食谱复制到食谱文件夹?
- python - Geopandas每行不同的crs?
- python - 使用 python 打开终端并在 docker 中运行命令
- javascript - 在 Blazor 服务器端中,如何检测用户是否尝试离开当前页面
- python - 如何在 Tensorflow 2 LSTM 训练中屏蔽多输出?
- html - 引导导入影响所有其他 CSS 设计
- javascript - 如何测试测试中的负面行为?就像调用 API 失败一样
- node.js - 托管在 Heroku 上的 React 应用程序抛出 500 服务器错误
- php - 学习 PHP:尝试使用 CREATE DATABASE IF NOT EXISTS 添加新数据库 // 出错 SQLSTATE[HY000] [1049] base unknow