Web Components 地理的データ モデルのバインディング
Ignite UI for Web Components マップ コンポーネントは、シェイプ ファイルからの地理空間データやデータ モデルからの地理的位置を地理的画像マップに表示するように設計されています。地理的シリーズの ItemsSource
プロパティは、データ モデルへのバインディングのために使用されます。このプロパティは、カスタム オブジェクトの配列にバインドできます。
Web Components 地理的データ モデルのバインディングの例
export class WorldUtils {
public static calcPaths(origin: any , dest : any ): any [] {
let interval = 200 ;
let paths: any [] = [[]];
let pathID = 0 ;
let distance = this .calcDistance(origin, dest);
if (distance <= interval) {
paths[pathID].push({ x : origin.lon, y : origin.lat });
paths[pathID].push({ x : dest.lon, y : dest.lat });
} else {
let current = origin;
let previous = origin;
for (let dist = interval; dist <= distance; dist += interval)
{
previous = current
paths[pathID].push({ x : current.lon, y : current.lat });
let bearing = this .calcBearing(current, dest);
current = this .calcDestination(current, bearing, interval);
if (previous.lon > 150 && current.lon < -150 ) {
paths[pathID].push({ x : 180 , y : current.lat });
paths.push([]);
pathID++
current = { lon : -180 , lat : current.lat }
} else if (previous.lon < -150 && current.lon > 150 ) {
paths[pathID].push({ x : -180 , y : current.lat });
paths.push([]);
pathID++
current = { lon : 180 , lat : current.lat }
}
}
paths[pathID].push({ x : dest.lon, y : dest.lat });
}
return paths;
}
public static calcBearing(origin: any , dest : any ): number
{
origin = this .toRadianLocation(origin);
dest = this .toRadianLocation(dest);
let range = (dest.lon - origin.lon);
let y = Math .sin(range) * Math .cos(dest.lat);
let x = Math .cos(origin.lat) * Math .sin(dest.lat) -
Math .sin(origin.lat) * Math .cos(dest.lat) * Math .cos(range);
let angle = Math .atan2(y, x);
return this .toDegreesNormalized(angle);
}
public static calcDestination(origin: any , bearing : number , distance : number ): any {
let radius = 6371.0 ;
origin = this .toRadianLocation(origin);
bearing = this .toRadians(bearing);
distance = distance / radius;
let lat = Math .asin(Math .sin(origin.lat) * Math .cos(distance) +
Math .cos(origin.lat) * Math .sin(distance) * Math .cos(bearing));
let x = Math .sin(bearing) * Math .sin(distance) * Math .cos(origin.lat);
let y = Math .cos(distance) - Math .sin(origin.lat) * Math .sin(origin.lat);
let lon = origin.lon + Math .atan2(x, y);
lon = (lon + 3 * Math .PI) % (2 * Math .PI) - Math .PI;
lon = this .toDegrees(lon);
lat = this .toDegrees(lat);
return { lon : lon, lat : lat };
}
public static calcDistance(origin: any , dest : any ): number {
origin = this .toRadianLocation(origin);
dest = this .toRadianLocation(dest);
let sinProd = Math .sin(origin.lat) * Math .sin(dest.lat);
let cosProd = Math .cos(origin.lat) * Math .cos(dest.lat);
let lonDelta = (dest.lon - origin.lon);
let angle = Math .acos(sinProd + cosProd * Math .cos(lonDelta));
let distance = angle * 6371.0 ;
return distance;
}
public static toRadianLocation(geoPoint: any ): any {
let x = this .toRadians(geoPoint.lon);
let y = this .toRadians(geoPoint.lat);
return { lon : x, lat : y };
}
public static toRadians(degrees: number ): number
{
return degrees * Math .PI / 180 ;
}
public static toDegrees(radians: number ): number {
return (radians * 180.0 / Math .PI);
}
public static toDegreesNormalized(radians: number ): number
{
let degrees = this .toDegrees(radians);
degrees = (degrees + 360 ) % 360 ;
return degrees;
}
public static toStringLat(latitude: number ): string {
let str = Math .abs(latitude).toFixed(1 ) + "°" ;
return latitude > 0 ? str + "N" : str + "S" ;
}
public static toStringLon(coordinate: number ): string {
let val = Math .abs(coordinate);
let str = val < 100 ? val.toFixed(1 ) : val.toFixed(0 );
return coordinate > 0 ? str + "°E" : str + "°W" ;
}
public static toStringAbbr(value: number ): string {
if (value > 1000000000000 ) {
return (value / 1000000000000 ).toFixed(1 ) + " T"
} else if (value > 1000000000 ) {
return (value / 1000000000 ).toFixed(1 ) + " B"
} else if (value > 1000000 ) {
return (value / 1000000 ).toFixed(1 ) + " M"
} else if (value > 1000 ) {
return (value / 1000 ).toFixed(1 ) + " K"
}
return value.toFixed(0 );
}
public static getLongitude(location: any ): number {
if (location.x) return location.x;
if (location.lon) return location.lon;
if (location.longitude) return location.longitude;
return Number .NaN;
}
public static getLatitude(location: any ): number {
if (location.y) return location.y;
if (location.lat) return location.lat;
if (location.latitude) return location.latitude;
return Number .NaN;
}
public static getBounds(locations: any []): any {
let minLat = 90 ;
let maxLat = -90 ;
let minLon = 180 ;
let maxLon = -180 ;
for (const location of locations) {
const crrLon = this .getLongitude(location);
if (!Number .isNaN(crrLon)) {
minLon = Math .min(minLon, crrLon);
maxLon = Math .max(maxLon, crrLon);
}
const crrLat = this .getLatitude(location);
if (!Number .isNaN(crrLat)) {
minLat = Math .min(minLat, crrLat);
maxLat = Math .max(maxLat, crrLat);
}
}
const geoBounds = {
left : minLon,
top : minLat,
width : Math .abs(maxLon - minLon),
height : Math .abs(maxLat - minLat)
};
return geoBounds;
}
public static getNightShapes(): any [] {
let nightShape = [];
let line: any [] = [];
for (let lon = -180 ; lon <= 180 ; lon += 1 ) {
let x = lon;
let y = 75 * Math .cos(lon * Math .PI / 180 );
line.push({x : x, y : y});
}
let coordinateLine = {points : [line]};
nightShape.push(coordinateLine);
return nightShape;
}
}
ts コピー import { WorldUtils } from './WorldUtils' ;
import { IgcGeographicMapModule } from 'igniteui-webcomponents-maps' ;
import { IgcGeographicMapComponent } from 'igniteui-webcomponents-maps' ;
import { IgcGeographicSymbolSeriesComponent } from 'igniteui-webcomponents-maps' ;
import { IgcGeographicPolylineSeriesComponent } from 'igniteui-webcomponents-maps' ;
import { IgcDataChartInteractivityModule } from 'igniteui-webcomponents-charts' ;
import { MarkerType } from 'igniteui-webcomponents-charts' ;
import { ModuleManager } from 'igniteui-webcomponents-core' ;
ModuleManager.register(
IgcDataChartInteractivityModule,
IgcGeographicMapModule
);
export class MapBindingDataModel {
private geoMap: IgcGeographicMapComponent;
public flights: any [] = [];
constructor ( ) {
const cityDAL = { lat : 32.763 , lon : -96.663 , country : 'US' , name : 'Dallas' };
const citySYD = { lat : -33.889 , lon : 151.028 , country : 'Australia' , name : 'Sydney' };
const cityNZL = { lat : -36.848 , lon : 174.763 , country : 'New Zealand' , name : 'Auckland' };
const cityQTR = { lat : 25.285 , lon : 51.531 , country : 'Qatar' , name : 'Doha' };
const cityPAN = { lat : 8.949 , lon : -79.400 , country : 'Panama' , name : 'Panama' };
const cityCHL = { lat : -33.475 , lon : -70.647 , country : 'Chile' , name : 'Santiago' };
const cityJAP = { lat : 35.683 , lon : 139.809 , country : 'Japan' , name : 'Tokyo' };
const cityALT = { lat : 33.795 , lon : -84.349 , country : 'US' , name : 'Atlanta' };
const cityJOH = { lat : -26.178 , lon : 28.004 , country : 'South Africa' , name : 'Johannesburg' };
const cityNYC = { lat : 40.750 , lon : -74.0999 , country : 'US' , name : 'New York' };
const citySNG = { lat : 1.229 , lon : 104.177 , country : 'Singapore' , name : 'Singapore' };
const cityMOS = { lat : 55.750 , lon : 37.700 , country : 'Russia' , name : 'Moscow' };
const cityROM = { lat : 41.880 , lon : 12.520 , country : 'Italy' , name : 'Roma' };
const cityLAX = { lat : 34.000 , lon : -118.25 , country : 'US' , name : 'Los Angeles' };
this .flights = [
{ origin : cityDAL, dest : citySNG, color : 'Green' },
{ origin : cityMOS, dest : cityNZL, color : 'Red' },
{ origin : cityCHL, dest : cityJAP, color : 'Blue' },
{ origin : cityPAN, dest : cityROM, color : 'Orange' },
{ origin : cityALT, dest : cityJOH, color : 'Black' },
{ origin : cityNYC, dest : cityQTR, color : 'Purple' },
{ origin : cityLAX, dest : citySYD, color : 'Gray' },
];
this .geoMap = document .getElementById('geoMap' ) as IgcGeographicMapComponent;
this .geoMap.updateZoomWindow({ left : 0.2 , top : 0.1 , width : 0.6 , height : 0.6 });
for (const flight of this .flights) {
this .createPolylineSeries(flight);
this .createSymbolSeries(flight);
}
}
public createSymbolSeries (flight: any )
{
const geoLocations = [flight.origin, flight.dest ];
const symbolSeries = new IgcGeographicSymbolSeriesComponent();
symbolSeries.dataSource = geoLocations;
symbolSeries.markerType = MarkerType.Circle;
symbolSeries.latitudeMemberPath = 'lat' ;
symbolSeries.longitudeMemberPath = 'lon' ;
symbolSeries.markerBrush = 'White' ;
symbolSeries.markerOutline = flight.color;
symbolSeries.thickness = 1 ;
this .geoMap.series.add(symbolSeries);
}
public createPolylineSeries (flight: any )
{
const geoPath = WorldUtils.calcPaths(flight.origin, flight.dest);
const geoDistance = WorldUtils.calcDistance(flight.origin, flight.dest);
const geoRoutes = [
{ points : geoPath ,
origin : flight.origin,
dest : flight.dest,
distance : geoDistance,
time : geoDistance / 850 ,
}];
const lineSeries = new IgcGeographicPolylineSeriesComponent();
lineSeries.dataSource = geoRoutes;
lineSeries.shapeMemberPath = 'points' ;
lineSeries.shapeStrokeThickness = 9 ;
lineSeries.shapeOpacity = 0.5 ;
lineSeries.shapeStroke = flight.color;
this .geoMap.series.add(lineSeries);
}
}
new MapBindingDataModel();
ts コピー <!DOCTYPE html >
<html >
<head >
<title > MapBindingDataModel</title >
<meta charset ="UTF-8" />
<link rel ="shortcut icon" href ="https://static.infragistics.com/xplatform/images/browsers/wc.png" >
<link rel ="stylesheet" href ="https://fonts.googleapis.com/icon?family=Material+Icons" />
<link rel ="stylesheet" href ="https://fonts.googleapis.com/css?family=Kanit&display=swap" />
<link rel ="stylesheet" href ="https://fonts.googleapis.com/css?family=Titillium Web" />
<link rel ="stylesheet" href ="https://static.infragistics.com/xplatform/css/samples/shared.v8.css" type ="text/css" />
</head >
<body >
<div id ="root" >
<div class ="container sample" >
<igc-geographic-map id ="geoMap" width ="100%" height ="100%" >
</igc-geographic-map >
</div >
</div >
<% if (false) { %><script src ="src/index.ts" > </script > <% } %>
</body >
</html >
html コピー
このサンプルが気に入りましたか? 完全な Ignite UI for Web Componentsツールキットにアクセスして、すばやく独自のアプリの作成を開始します。無料でダウンロードできます。
以下の表で、地理的シリーズのタイプごとに必要となるデータ構造を簡単に説明します。
コード スニペット
以下のコードは、IgcGeographicSymbolSeriesComponent
を、経度と緯度の座標を使用して格納された世界の一部の都市の地理的位置を含むカスタム データ モデルにバインドする方法を示します。また、WorldUtility を使用してこれらの場所間の最短の地理的経路をプロットするために IgcGeographicPolylineSeriesComponent
を使用します。
<igc-geographic-map id ="geoMap" width ="100%" height ="100%" >
</igc-geographic-map >
html
public flights: any [];
constructor ( ) {
super ();
const cityDAL = { lat : 32.763 , lon : -96.663 , country : "US" , name : "Dallas" };
const citySYD = { lat : -33.889 , lon : 151.028 , country : "Australia" , name : "Sydney" };
const cityNZL = { lat : -36.848 , lon : 174.763 , country : "New Zealand" , name : "Auckland" };
const cityQTR = { lat : 25.285 , lon : 51.531 , country : "Qatar" , name : "Doha" };
const cityPAN = { lat : 8.949 , lon : -79.400 , country : "Panama" , name : "Panama" };
const cityCHL = { lat : -33.475 , lon : -70.647 , country : "Chile" , name : "Santiago" };
const cityJAP = { lat : 35.683 , lon : 139.809 , country : "Japan" , name : "Tokyo" };
const cityALT = { lat : 33.795 , lon : -84.349 , country : "US" , name : "Atlanta" };
const cityJOH = { lat : -26.178 , lon : 28.004 , country : "South Africa" , name : "Johannesburg" };
const cityNYC = { lat : 40.750 , lon : -74.0999 , country : "US" , name : "New York" };
const citySNG = { lat : 1.229 , lon : 104.177 , country : "Singapore" , name : "Singapore" };
const cityMOS = { lat : 55.750 , lon : 37.700 , country : "Russia" , name : "Moscow" };
const cityROM = { lat : 41.880 , lon : 12.520 , country : "Italy" , name : "Roma" };
const cityLAX = { lat : 34.000 , lon : -118.25 , country : "US" , name : "Los Angeles" };
this .flights = [
{ origin : cityDAL, dest : citySNG, color : "Green" },
{ origin : cityMOS, dest : cityNZL, color : "Red" },
{ origin : cityCHL, dest : cityJAP, color : "Blue" },
{ origin : cityPAN, dest : cityROM, color : "Orange" },
{ origin : cityALT, dest : cityJOH, color : "Black" },
{ origin : cityNYC, dest : cityQTR, color : "Purple" },
{ origin : cityLAX, dest : citySYD, color : "Gray" },
];
}
connectedCallback ( ) {
this .geoMap = document .getElementById("geoMap" ) as IgcGeographicMapComponent;
for (const flight of this .flights) {
this .createPolylineSeries(flight);
this .createSymbolSeries(flight);
}
}
createSymbolSeries (flight: any )
{
const geoLocations = [flight.origin, flight.dest ];
const symbolSeries = new IgcGeographicSymbolSeriesComponent();
symbolSeries.dataSource = geoLocations;
symbolSeries.markerType = MarkerType.Circle;
symbolSeries.latitudeMemberPath = "lat" ;
symbolSeries.longitudeMemberPath = "lon" ;
symbolSeries.markerBrush = "White" ;
symbolSeries.markerOutline = flight.color;
symbolSeries.thickness = 1 ;
this .geoMap.series.add(symbolSeries);
}
createPolylineSeries (flight: any )
{
const geoPath = WorldUtils.calcPaths(flight.origin, flight.dest);
const geoDistance = WorldUtils.calcDistance(flight.origin, flight.dest);
const geoRoutes = [
{ points : geoPath ,
origin : flight.origin,
dest : flight.dest,
distance : geoDistance,
time : geoDistance / 850 ,
}];
const lineSeries = new IgcGeographicPolylineSeriesComponent();
lineSeries.dataSource = geoRoutes;
lineSeries.shapeMemberPath = "points" ;
lineSeries.shapeStrokeThickness = 9 ;
lineSeries.shapeOpacity = 0.5 ;
lineSeries.shapeStroke = flight.color;
this .geoMap.series.add(lineSeries);
}
ts
API リファレンス