首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用ST_AsSVG变换生成SVG (EPSG: 4326)到(EPSG: 3857)

利用ST_AsSVG变换生成SVG (EPSG: 4326)到(EPSG: 3857)
EN

Stack Overflow用户
提问于 2021-12-02 10:19:49
回答 1查看 176关注 0票数 1

我有一个Django模型,它包含多边形的坐标:

代码语言:javascript
复制
geometria = models.PolygonField(srid=4326, null=True, geography=True)

我手动从Google地图web界面获取一个多边形的lat长坐标,并将它们输入数据库。我相信谷歌地图提供的全球定位系统坐标是4326。

我使用@react google /api在谷歌地图上绘制了这些坐标,它与我所期望的相符。(见下图)

接下来,我尝试使用Postgis复制多边形形状,并创建其中的SVG,但这是我遇到问题的地方。如您所见,绿色多边形具有相同的基本形状,但与谷歌地图的输出相比,它已经被水平拉伸。

我认为问题在于svg使用的是4326投影,而不是谷歌地图使用的3857吗?我试图在postgis中转换数据,但我所做的一切似乎都没有什么不同。注意,当我在没有ST_Transform的情况下创建svg时,它的形状如下所示。我有什么办法解决这个问题吗?

我在Django中使用以下SQL从数据库中提取数据:

代码语言:javascript
复制
cursor.execute("SELECT ST_AsSVG(ST_AsEWKT(ST_Transform(ST_AsEWKT(geometria),3857))) FROM public.locations_locationdata WHERE id= %s", [self.id])

其中geometria是包含多边形的数据库字段。

我使用以下python构建svg文件:

代码语言:javascript
复制
svg_string = []
svg_string.append('<svg viewBox="')
svg_string.append(calculated_view_box)
svg_string.append('" xmlns="http://www.w3.org/2000/svg" width="512" height="512" version="1.1" transform="scale(1 -1) rotate(90)" transform-origin="256 256">')
svg_string.append('<path fill="green" stroke="blue" stroke-width="1" d="')
svg_string.append(reconstruct_path_string)
svg_string.append('"/></svg>')



<svg viewBox="5735636.0 75092.0 419.0 619.0" xmlns="http://www.w3.org/2000/svg" width="512" height="512" version="1.1" transform="scale(1 -1) rotate(90)" transform-origin="256 256"><path fill="green" stroke="blue" stroke-width="1" d="M 5736044.89547394 75658.7303669334 L 5735771.38348506 75102.09404005 5735654.72065871 75164.2146256582 5735646.59433588 75700.4781146285 5735842.07136171 75663.4061145318 Z"/></svg>

有什么想法吗?我怎样才能修复svg,使其与google地图形状相匹配?

EN

回答 1

Stack Overflow用户

发布于 2021-12-06 17:38:59

问题是在创建GEOSGeometry对象时,我不正确地转换了lat和lng值。后来,当我把lat和lng传递回谷歌地图时,我修复了这个换位,这掩盖了问题。

见下文:

代码语言:javascript
复制
#polygon = GEOSGeometry('POLYGON ((51.527768 -0.679638,51.525311 -0.674638,51.524263 -0.675196,51.524190 -0.680013,51.525946 -0.679680,51.527768 -0.679638))', srid=4326)
polygon = GEOSGeometry('POLYGON ((-0.679638 51.527768, -0.674638 51.525311, -0.675196 51.524263, -0.680013 51.524190, -0.679680 51.525946, -0.679638 51.527768))', srid=4326)

坐标应该是(经纬度)对

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70197673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档