/
geo.ts
86 lines (83 loc) · 2.67 KB
/
geo.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import { assign } from '@antv/util';
import { geoArea, geoCentroid, geoContains, geoDistance, geoLength, ExtendedFeature } from 'd3-geo';
import { geoProject } from 'd3-geo-projection';
import { View } from '../view';
import getGeoProjection from '../util/get-geo-projection';
const api = {
// geo maintain
geoArea(feature: ExtendedFeature) {
return geoArea(feature);
},
geoAreaByName(this: View, name: string) {
return geoArea(this.geoFeatureByName(name));
},
geoCentroid(feature: ExtendedFeature) {
return geoCentroid(feature);
},
geoCentroidByName(this: View, name: string) {
return geoCentroid(this.geoFeatureByName(name));
},
geoDistance(p1: any, p2: any) {
return geoDistance(p1, p2);
},
geoLength(feature: ExtendedFeature) {
return geoLength(feature);
},
geoLengthByName(this: View, name: string) {
return geoLength(this.geoFeatureByName(name));
},
geoContains(feature: ExtendedFeature, position: [number, number] /* [longitude, latitude] */) {
return geoContains(feature, position);
},
geoFeatureByName(this: View, name: string): any {
const rows = this.rows;
let result;
rows.some((feature) => {
if (feature.name === name) {
result = feature;
return true;
}
return false;
});
return result;
},
geoFeatureByPosition(this: View, position: [number, number]): any {
const rows = this.rows;
let result;
rows.some((feature) => {
if (geoContains(feature, position)) {
result = feature;
return true;
}
return false;
});
return result;
},
geoNameByPosition(this: View, position: [number, number]) {
const feature = this.geoFeatureByPosition(position);
if (feature) {
return feature.name;
}
},
// projection
// export getGeoProjection for custom used.
getGeoProjection,
geoProject(feature: ExtendedFeature, projection: string, exportRaw?: boolean) {
projection = getGeoProjection(projection, exportRaw);
return geoProject(feature, projection);
},
geoProjectByName(this: View, name: string, projection: string, exportRaw?: boolean) {
projection = getGeoProjection(projection, exportRaw);
return geoProject(this.geoFeatureByName(name), projection);
},
geoProjectPosition(position: [number, number], projection: string, exportRaw?: boolean) {
const func = getGeoProjection(projection, exportRaw);
return func(position);
},
geoProjectInvert(position: [number, number] /* [x, y] */, projection: string, exportRaw?: boolean) {
const func = getGeoProjection(projection, exportRaw);
return func.invert(position);
},
};
assign(View.prototype, api);
export type GeoApi = typeof api;