我从开街地图项目下载的街道信息。 这个文件基本上是与以下字段的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
你可以做到这一点与JTS 。 这很容易从它的EWKB十六进制表示加载的几何形状,使用WBKReader
。
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的中央,所以很容易依赖添加到您的项目。
<dependency>
<groupId>com.vividsolutions</groupId>
<artifactId>jts</artifactId>
<version>1.13</version> <!-- or RELEASE as stated in @RobAu comment below -->
</dependency>
至于幻数4326是一个用于地理坐标共同SRID这是对WGS84球体的经度/纬度。
你可以阅读此链接和一个关于这个数字,和一个不错的介绍,所有的东西。