【问题标题】:How to convert HEXEWKB to Latitude, Longitude (in java)?如何将 HEXEWKB 转换为纬度、经度(在 java 中)?
【发布时间】:2013-12-19 05:06:24
【问题描述】:

我从 Open Street Map 项目下载了街道信息。该文件基本上是一个包含以下字段的 CSV:

CSV fields
==============================================
1 : id; UniqueId of the street(always null for the moment)
2 : name; The name 
3 : location; The middle point of the street in HEXEWKB
4 : length ; Length of the street in meters
5 : countrycode; The iso3166 Alpha2 Code of the country 
6 : gid ; GlobalId (not use yet)
7 : type; The type of street (see bellow)
8 : oneway; Whether the street is a one way street
9 : shape; The delimitation of the street in HEXEWKB 

我找不到如何将此 HEXEWKB 字段转换为对我有用的内容,例如纬度、经度。谁能给我一些关于这种格式如何工作的指示(或者更好的是,给我一些为我完成这项工作的java lib)?

CSV 中的示例行:

3343954 Blijde Inkomststraat    0101000020E6100000AECB9307F9D812400F2ADCE003704940  454.419285782969    NL      tertiary    t0102000020E610000007000000CD4301367BDB1240B59377C4D76F49402E7A02BC60DB12404F80176CD96F494061C8451042DB1240F5B814FCDB6F49405104279133DB12402AE0432EDD6F4940875C5FDA26DB12409434DA05DE6F494018DEF64E16D81240FCA2A9431370494049B258D471D61240839A6BE22E704940
3343967 Dagobertstraat  0101000020E6100000E40AAE6CD6DA1240941F95531C704940  216.34491093149 NL      residential f   0102000020E610000004000000F15C29159ED9124094FF2499307049406EDDCD531DDA1240C8E99040287049400CC2267C00DC12409672631F097049403A5739590FDC12400EA9FD3108704940
3343968 Bogaardenstraat 0101000020E6100000C0D7C68E7CD81240F550364044704940  125.953915569017    NL      residential f   0102000020E610000002000000224D614AC9D7124048B19245507049405F622CD32FD91240A2F0D93A38704940

【问题讨论】:

    标签: java gis latitude-longitude openstreetmap postgis


    【解决方案1】:

    您可以使用JTS 做到这一点。使用WBKReader,可以轻松地从其 EWKB 十六进制表示加载几何。

    import com.vividsolutions.jts.geom.Geometry;
    import com.vividsolutions.jts.geom.GeometryFactory;
    import com.vividsolutions.jts.geom.PrecisionModel;
    import com.vividsolutions.jts.io.WKBReader;
    
    import java.util.Arrays;
    import java.util.List;
    
    public class Foo {
        public static void main(String... args) throws Exception {
            final List<String> points = Arrays.asList(
                    "0101000020E6100000AECB9307F9D812400F2ADCE003704940",
                    "0101000020E6100000E40AAE6CD6DA1240941F95531C704940",
                    "0101000020E6100000C0D7C68E7CD81240F550364044704940"
            );
            final GeometryFactory gm = new GeometryFactory(new PrecisionModel(), 4326);
            final WKBReader wkbr = new WKBReader(gm);
            for (String point: points) {
                byte[] wkbBytes = wkbr.hexToBytes(point);
                final Geometry geom = wkbr.read(wkbBytes);
                System.out.printf("%s -> %s\n", point, geom.toText());
                // you can access longitude and latitude via
                double longitude = geom.getCoordinate().x;
                double latitude = geom.getCoordinate().y;
                // then do what you need to do with it
            }
        }
    }
    

    将打印:

    0101000020E6100000AECB9307F9D812400F2ADCE003704940 -> POINT (4.7118874725301065 50.87511835813722)
    0101000020E6100000E40AAE6CD6DA1240941F95531C704940 -> POINT (4.713708589670862 50.875864455999505)
    0101000020E6100000C0D7C68E7CD81240F550364044704940 -> POINT (4.71141265 50.87708285)
    

    您可能还知道 JTS 位于 maven Central 上,因此向您的项目添加依赖项很容易。

    <dependency>
        <groupId>com.vividsolutions</groupId>
        <artifactId>jts</artifactId>
        <version>1.13</version> <!-- or RELEASE as stated in @RobAu comment below -->
    </dependency>
    

    至于幻数 4326 是 common SRID for geographic coordinates,它是 WGS84 球体上的经度/纬度。

    您可以阅读this linkthat one 来了解这个数字,以及对所有这些内容的精彩介绍。

    【讨论】:

    猜你喜欢
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 2010-09-11
    相关资源
    最近更新 更多