坐标数据存储
地理数据有自己的特有的格式, 如果业务里有了空间数据库, 最好以空间数据的方式 存到数据库, 常见的空间数据库有 PostGIS
等
但是有的系统比较老还没有使用空间数据库或者因为其他的原因导致不能使用空间数据库来存储, 在yymap里我们是这么解决的
警告
这不是好的解决方式, 只是为了兼容一些老的系统采取的妥协方案, 最好用空间数据库去存储的业务数据, 尤其你的业务系统是强GIS的情况下
定义
- 经度和纬度用
,
来分割 - 经纬度之间用
;
来分割 - 经纬度串(path/ring)之间用
#
来分割
警告
当图形是 Polygon
是, #
后面表示的内环, 即洞 demo
- 多面之间用
|
来分割
图形 | 效果图 | 举例 |
---|---|---|
Point | ![]() | 119.30328654169921, 31.69102895625562 |
MultiPoint | ![]() | 119.36268137812499, 31.699500370186655; 119.36199473261718, 31.667363324358092 |
LineString | ![]() | 119.36268137812499, 31.699500370186655; 119.36199473261718, 31.667363324358092 |
MultiLineString | ![]() | x, y; x, y; x, y#x, y; x, y; x, y |
Polygon | ![]() | x, y; x, y; x, y#x, y; x, y; x, y |
MultiPolygon | ![]() |
警告
当图形是 Polygon
是, #
后面表示的内环, 即洞 demo
js
//点
// x,y 比如:119.30328654169921,31.69102895625562
// 多点/线
// x,y;x,y;x,y;x,y;x,y;x,y;x,y;x,y...... 比如:119.36268137812499,31.699500370186655;119.36199473261718,31.667363324358092;119.3266
//多线/面
// x,y;x,y;x,y;x,y#x,y;x,y;x,y;x,y#x,y;x,y;x,y;x,y 比如:119.28921030878905,31.524950318348118;119.42791270136718,31.518219065452257;119.52026652216796,31.526413570013432#119.29092692255858,31.494509487563704;119.40799998164061,31.480456529957877;119.50962351679686,31.487190502245852;119.63596629023436,31.501827900123743120,31;120,31;120,31
//多面
// x,y;x,y;x,y;x,y#x,y;x,y;x,y;x,y#x,y;x,y;x,y;x,y|x,y;x,y;x,y;x,y#x,y;x,y;x,y;x,y#x,y;x,y;x,y;x,y 比如:119.80488108515613,31.684601850477662;119.87560557246081,31.68255676894475;119.88659190058581,31.645737598767795;119.86702250361316,31.58433990222474;119.83749674677722,31.542507825263016;119.77810191035155,31.537826146228866;119.75818919062499,31.54777443351415;119.80488108515613,31.684601850477662#119.81758402705077,31.626445544239715;119.83955668330077,31.642230250162726;119.85431956171863,31.61533618254296;119.82822703242175,31.58346249890937;119.78668497919921,31.565912698019673;119.81758402705077,31.626445544239715|119.85603617548816,31.549237327508166;119.87354563593738,31.54689668611033;119.88212870478503,31.556844006590467;119.88830851435534,31.55216304669787;119.8855619323241,31.544555986007452;119.89380167841784,31.539581803381253;119.88933848261706,31.53285160500397;119.88144205927722,31.53811875804709;119.87182902216784,31.53665568978485;119.84882639765613,31.541630028328854;119.85603617548816,31.549237327508166
存储
在普通的关系数据库里将经纬度以普通的字符串存储
DANGER
注意经纬度串字段请使用 text
类型, 因为经纬度字符串可能非常长, 否则会导致保存数据时异常
序列化/反序列化
yymap 内部里提供了序列化和反序列化工具
YY. GH.arrayToStr(lnglats)
将经纬度数组序列化成字符串 lnglat支持 一维数组,二维数组, 三维数组, 四维数组YY. GH.strToArray(str)
将字符串反序列化经纬度数组 返回的结果可能是 一维数组,二维数组, 三维数组, 四维数组, 具体的有你的字符串格式决定的overlay.serialize()
将图形序列化成关系数据库可以直接保存的数据结构 demo
js
const lnglats = [120, 31];
const str = YY.GH.arrayToStr(lnglats);
//str: '120,31'
const lnglats1 = YY.GH.strToArray(str);
//lnglats1: [120,31]
const point = new YY.Point(lnglats1);
const row = point.serialize();
//row:{altitude: 0,lnglats: "120,31",shapeType: "Point"}
YY.GH.arrayToStr([
[
[117.104554, 30.504444],
[117.118974, 30.506219],
[117.12893, 30.508586],
[117.13305, 30.511248],
[117.139917, 30.514501],
[117.147126, 30.518642],
[117.153993, 30.5216],
[117.161546, 30.526036],
[117.171502, 30.529289],
[117.177339, 30.531655],
[117.184892, 30.531063],
[117.197595, 30.533133],
[117.212014, 30.535499],
[117.223001, 30.536682],
[117.233987, 30.536977],
[117.23845, 30.538456],
[117.240854, 30.545848],
[117.251153, 30.543778],
[117.251497, 30.53816],
[117.24875, 30.530767],
[117.246347, 30.523965],
[117.243943, 30.515684],
[117.241197, 30.504149],
[117.238107, 30.493795],
[117.229524, 30.481073],
[117.221971, 30.474268],
[117.215104, 30.469533],
[117.204461, 30.466574],
[117.190728, 30.462727],
[117.183862, 30.464207],
[117.156739, 30.47456],
[117.14644, 30.47841],
[117.140603, 30.482257],
[117.127214, 30.485215],
[117.107988, 30.487878]
],
[
[117.162061, 30.49361],
[117.167211, 30.49716],
[117.172361, 30.50071],
[117.177167, 30.505739],
[117.184034, 30.512542],
[117.18987, 30.522894],
[117.2012, 30.525851],
[117.210126, 30.527034],
[117.219396, 30.526443],
[117.225919, 30.527034],
[117.234159, 30.529104],
[117.237935, 30.528808],
[117.235532, 30.522894],
[117.234502, 30.516683],
[117.232785, 30.507514],
[117.226262, 30.491835],
[117.217336, 30.480297],
[117.202916, 30.4729],
[117.194677, 30.470828],
[117.184034, 30.473491],
[117.177511, 30.47793],
[117.170644, 30.484439],
[117.167897, 30.489173]
]
]);
//out: '117.104554,30.504444;117.118974,30.506219;117.12893,30.508586;117.13305,30.511248;117.139917,30.514501;117.147126,30.518642;117.153993,30.5216;117.161546,30.526036;117.171502,30.529289;117.177339,30.531655;117.184892,30.531063;117.197595,30.533133;117.212014,30.535499;117.223001,30.536682;117.233987,30.536977;117.23845,30.538456;117.240854,30.545848;117.251153,30.543778;117.251497,30.53816;117.24875,30.530767;117.246347,30.523965;117.243943,30.515684;117.241197,30.504149;117.238107,30.493795;117.229524,30.481073;117.221971,30.474268;117.215104,30.469533;117.204461,30.466574;117.190728,30.462727;117.183862,30.464207;117.156739,30.47456;117.14644,30.47841;117.140603,30.482257;117.127214,30.485215;117.107988,30.487878#117.162061,30.49361;117.167211,30.49716;117.172361,30.50071;117.177167,30.505739;117.184034,30.512542;117.18987,30.522894;117.2012,30.525851;117.210126,30.527034;117.219396,30.526443;117.225919,30.527034;117.234159,30.529104;117.237935,30.528808;117.235532,30.522894;117.234502,30.516683;117.232785,30.507514;117.226262,30.491835;117.217336,30.480297;117.202916,30.4729;117.194677,30.470828;117.184034,30.473491;117.177511,30.47793;117.170644,30.484439;117.167897,30.489173'