当前位置: 首页 > 知识库问答 >
问题:

是否可以在这里直接将灵活折线写入PostGIS?

呼延哲
2023-03-14

有没有可能直接在我的postgis/postgres数据库中写入一个灵活的折线,而不需要解码,转换成文本,然后用ST_MakeLine(ST_MakePoint(...)做一个几何图形?恐怕这是不可能的(除了用google编码的折线)。还是有什么东西可以用?

背景:我正在测试用于路由的HERE-API。我找到了从GitHub解码结果折线的Java源:https://github.com/heremaps/flexible-polyline。因此我可以从这个可弯曲的折线字符串中读取坐标

  • 灵活折线:bg8_9j7cy11ixsblbobrenbrerjrjzf3dngvc7gnbvhobjnki7bre7gvr7bjdrevh_e3i_evhvcre3snajnrtjijnvhjn7g_ovhsngnq_ezp_e_trenvreryjdvwrevgb7bnljd_tvcjxjdvgb5d9qb
  • 得到的坐标为:(47.774718/12.102489)(47.77474/12.10247)(47.77476/12.1024)(47.77474/12.10233)....(在德国南部)
  • 或作为PostGIS-请求:st_GeomFromText('LineString(12.102489 47.774718,12.10247 47.77474,12.1024 47.77476,12.10233....

我的要求是:

  • https://router.hereapi.com/v8/routes?transportmode=car&return=polyline,summary,travelsummary&routingmode=short&departuretime=2021-02-10t06:40:00&apikey=*****&origin=47.77494541091896,12.103053452705371&destination=47.77202596545944,12.095115520523986

但现在我想把这个点列表转换成PostGIS。我希望使用一个现有的函数,例如来自PostGIS的ST_LineFromEncodedPolyline。不幸的是,这并不能返回有效的结果,因为它是基于Google编码/解码算法的。从ST_LineFromEncodedPolyline得到的结果是(这清楚地表明了这些折线压缩之间的巨大差异):

SELECT ST_AsEWKT(ST_LineFromEncodedPolyline('BG8_9j7Cy11iXsBlBoBrEnBrErJr.....
--Result:
SRID=4326;LINESTRING(0.00004 -0.00002,0.0042 -0.00015,0.00422 -0.00405,0.00431 -0.00104,0.0048 ...

有没有什么方法,例如使用乘数从here-string得到这个几何图形?


共有1个答案

吕征
2023-03-14

由于我找不到答案或可行的解决方案,我就像我希望的那样写了……我的结果如下:

>

  • Java·jackson-解析器

    ObjectMapper oJacksonObjectMapper = new ObjectMapper();
    IOUtils.copy(oRespIputStream, oStringWriter, Charset.forName(StandardCharsets.UTF_8.name()) );
    JsonNode oJsonNode = oJacksonObjectMapper.readTree(sJsonString);
    

    RoutingHeResection.java

    @JsonProperty("polyline")
    private String polylineString;
    private List<LatLngZ> listeLatLonCoords; 
    private String listeLatLonCoordsAsPostgisString;
    

    polylineEncoderDecoder.java(来自Github)添加的方法:

    public String getKoordinatenMitSpaceFuerPostgis() {
       return ""+ lng +" "+ lat;   // => not lat/lng for Postgis
    }
    

    解析坐标字符串

      this.listeLatLonCoords = PolylineEncoderDecoder.decode( this.polylineString );
    

    循环创建LINESTRING

            this.listeLatLonCoordsAsPostgisString = "";
            if (this.getListeLatLonCoordsAnzahl()>0) {
                String sGeom = "LINESTRING(";
                for (int ii=0; ii<listeLatLonCoords.size();ii++) {
                    if (ii>0) { sGeom +=", "; }
                    sGeom += listeLatLonCoords.get(ii).getKoordinatenMitSpaceFuerPostgis();
                }
                sGeom += ")";
                this.listeLatLonCoordsAsPostgisString = sGeom;
            }
    

    插入到使用Jdbc

    String sSql = "INSERT INTO mytable ST_GeomFromText( ? ,4326) "
    Object[] oParam = new Object[] { oSectionReturn.getListeLatLonCoordsAsPostgisString() } 
    int[] oType = new int[] { java.sql.Types.VARCHAR }
    getJdbcTemplate().execute( sSql )
    

    就这样...或多或少。

  •  类似资料:
    • 如何在过境路线API的步行部分请求图形(用于绘制折线)? 以下是JSON Transport Route API结果的行走部分:

    • 问题内容: 我有3个屏幕,可以说, 登录 忘记密码 帮助画面 默认情况下,启动应用程序时将打开“登录”屏幕。单击“忘记密码”按钮时,将显示“忘记密码”屏幕,并且在单击“帮助”链接时将打开“帮助”屏幕。 我可以通过某种方式直接打开“忘记密码”屏幕,而无需执行使用 XCUITest 单击按钮的过程吗? 我建议与通过adb直接打开View的意图相同的内容。 问题答案: 据我所知,您不能使用XCUITes

    • 我用 react 写了一个页面,在这个页面里有几个模块,其中一些模块都有 a 标签,比如 footer.jsx 我想实现的是,当点击这里的 blog 或者 help 后会访问对应的页面,blog 访问 /blog,help 访问 /help。 然后在各自的页面里,可以重定向到其它的页面去,比如 blog -> /blog -> https://blog.domain.com help -> /he

    • 我知道Heroku使用临时文件系统,当dyno停止或重新启动时,文件会被丢弃,我对此没意见。我只需要临时存储文件。 我的ReactJS应用程序将一个. png图像文件写入/public文件夹——它在本地工作正常——但是没有任何东西被写入Heroku。可以将图像文件写入Heroku吗?如果可以,我需要配置什么设置吗?

    • 问题内容: 我想使用JavaScript将数据写入现有文件。我不想在控制台上打印它。我想实际将数据写入。我读了许多已回答的问题,但是他们在控制台上打印的每个位置。在某些地方,他们给出了代码,但是没有用。因此,请任何人帮助我如何实际将数据写入File。 我引用了代码,但是它不起作用:给出错误: 未捕获的TypeError:非法构造函数 在铬和 SecurityError:操作不安全。 在Mozill

    • 本文向大家介绍将数据写入块后是否可以更改数据?相关面试题,主要包含被问及将数据写入块后是否可以更改数据?时的应答技巧和注意事项,需要的朋友参考一下 回答:不,这是不可能的。如果需要进行任何修改,组织也必须从所有其他模块中删除信息。