SlideShare une entreprise Scribd logo
1  sur  32
Télécharger pour lire hors ligne
CONNECT. TRANSFORM. AUTOMATE.
FME Workspace Template Collection for Reading
Fundamental Geographic Data in Japan
Takashi Iijima	
  
FME Certified Professional, pragmatica inc.
Background: KSJ and FGD
Major Fundamental Geographic Datasets
provided by Japanese Governmental Organizations
KSJ: 国⼟土数値情報	
  (Kokudo Suuchi Jouho)
National Land Numerical Information
FGD: 基盤地図情報	
  (Kiban Chizu Jouho)
Fundamental Geospatial Data
CONNECT. TRANSFORM. AUTOMATE.
Background: KSJ Overview
!  Provider: 国⼟土交通省省	
  -- Ministry of Land,
Infrastructure, Transport and Tourism (MLIT)
!  http://nlftp.mlit.go.jp/ksj/
!  Feature Types: 60+; Geographic Features, Land
Use, Political Designated Zones, Administrative
Areas, Public Facilities, Transportation Facilities
etc. (Point, Line or Area)
!  Format: XML conforming to GML
!  GML reader cannot read the data.
CONNECT. TRANSFORM. AUTOMATE.
Background: FGD Overview
!  Provider: 国⼟土地理理院	
  -- Geospatial Information
Authority of Japan (GSI)
!  http://www.gsi.go.jp/kiban/etsuran.html
!  Feature Types: Vectorized Topographical Map
Elements (Point, Line or Area), Survey Reference
Point, Digital Elevation Model (DEM)
!  Format: XML conforming to GML
!  GML reader can read the data except DEM.
CONNECT. TRANSFORM. AUTOMATE.
Project Overview
!  Purpose: To provide easy and flexible way to read
KSJ and DEM in FGD with FME to increase their
usability.
!  Approach: Create FME workspaces to read the
datasets with the XML reader and create features
having appropriate geometry and attributes.
!  Goal: FME Template Collection
CONNECT. TRANSFORM. AUTOMATE.
Part 1. Reading KSJ
!  General Data Structure
!  Framework of Workspaces
!  Geometry Creation – Point
!  Geometry Creation – Line
!  Geometry Creation – Area
!  Resolving Incorrect Data with xfMap
CONNECT. TRANSFORM. AUTOMATE.
<?xml version="1.0" encoding="UTF-8"?>
<ksj:Dataset>
<gml:boundedBy>
<gml:EnvelopeWithTimePeriod srsName="JGD2000 / (B, L)" frame="GC / JST">
<gml:lowerCorner>20.0 123.0</gml:lowerCorner>
<gml:upperCorner>46.0 154.0</gml:upperCorner>
<gml:beginPosition calendarEraName="西暦">1900</gml:beginPosition>
<gml:endPosition indeterminatePosition="unknown"/>
</gml:EnvelopeWithTimePeriod>
</gml:boundedBy>
<gml:Point gml:id="n1">
<gml:pos>34.98509412 139.86044116</gml:pos>
</gml:Point>
<ksj:BusStop gml:id="ED01_1">
<ksj:position xlink:href="#n1"/>
<ksj:busStopName>西下町</ksj:busStopName>
<ksj:busRouteInformation>
<ksj:BusRouteInformation>
<ksj:busType>1</ksj:busType>
<ksj:busOperationCompany>JRバス関東(株)</ksj:busOperationCompany>
<ksj:busLineName>フラワー号</ksj:busLineName>
</ksj:BusRouteInformation>
</ksj:busRouteInformation>
</ksj:BusStop>
</ksj:Dataset>
KSJ: General Data Structure
CONNECT. TRANSFORM. AUTOMATE.
Envelope	
 
Geometries	
 
Features	
 
GML: Point, Curve,
OrientableCurve, Surface	
 
A feature links to a geometry
via "href" attribute.	
 
Contains SRS name:
JGD2000 or Tokyo Datum
KSJ: Framework of Workspaces
CONNECT. TRANSFORM. AUTOMATE.
Merge	
 
Features	
 
Geometries	
 
Envelope (SRS)	
 
Merge	
 
Set coordinate system
Modify attribute names
XML Reader feature type
with Feature Type Specific xfMap	
 
XML Reader feature type with Common xfMap
Creates geometries (Line, Area) with Custom Transformer	
 
XML Reader feature type created
with Common xfMap	
 
Add geometry to feature
Group By: fme_basename
Join On: geometry ID	
 
Add SRS name to feature
Group By: fme_basename
Unconditional merging
KSJ: Geometry Creation - Point
Mapping rule for <Point>
<mapping match="Point">
<feature-type>
<literal expr="Point" />
</feature-type>
<attributes>
<attribute>
<name><literal expr="Point.id" /></name>
<value><extract expr="@gml:id" /></value>
</attribute>
</attributes>
<geometry activate="xml-point">
<data name="data-string">
<extract expr="./pos"/>
</data>
<data name="axis-order">
<literal expr="2,1" />
</data>
</geometry>
</mapping>
CONNECT. TRANSFORM. AUTOMATE.
<Point> element example
<gml:Point gml:id="p1">
<gml:pos>36.02232800 139.00306800</gml:pos>
</gml:Point>
<gml:Point gml:id="p2">
<gml:pos>36.01240300 139.02192100</gml:pos>
</gml:Point>
<gml:Point gml:id="p3">
<gml:pos>36.04452300 139.05435900</gml:pos>
</gml:Point>
<gml:Point gml:id="p4">
<gml:pos>35.98977700 139.07710600</gml:pos>
</gml:Point>
<gml:Point gml:id="p5">
<gml:pos>35.99583200 139.07745600</gml:pos>
</gml:Point>
Points can be created simply with xfMap.
KSJ: Geometry Creation - Line
CONNECT. TRANSFORM. AUTOMATE.
Read <LineStringSegment> elements as XML fragments.
Create Line geometries with a Custom Transformer.
Mapping rule for <Curve>
<mapping match="Curve">
<feature-type>
<literal expr="Curve" />
</feature-type>
<attributes>
<attribute>
<name><literal expr="Curve.id" /></name>
<value><extract expr="@gml:id" /></value>
</attribute>
<attribute type="list">
<name><literal expr="LineStringSegment" /></name>
<value>
<extract expr="./segments/LineStringSegment" as-xml="true" />
</value>
</attribute>
</attributes>
</mapping>
<Curve> element example
<gml:Curve gml:id="c-85">
<gml:segments>
<gml:LineStringSegment>
<gml:posList>
35.91887573 139.92888998
35.91885861 139.92893361
35.91885472 139.92894500
35.91885472 139.92895778
35.91887972 139.92899667
35.91925667 139.92939778
35.91927722 139.92945889
</gml:posList>
</gml:LineStringSegment>
</gml:segments>
</gml:Curve>
KSJ: Geometry Creation - Line
CONNECT. TRANSFORM. AUTOMATE.
KsjLineBuilder (Custom Transformer) creates Line geometries.
Surface element example
<gml:Surface gml:id="a00001">
<gml:patches>
<gml:PolygonPatch>
<gml:exterior>
<gml:Ring>
<gml:curveMember xlink:href="#_c00003"/>
<gml:curveMember xlink:href="#_c00002"/>
<gml:curveMember xlink:href="#_c00001"/>
</gml:Ring>
</gml:exterior>
<gml:interior>
<gml:Ring>
<gml:curveMember xlink:href="#_c00004"/>
</gml:Ring>
</gml:interior>
<gml:interior>
<gml:Ring>
<gml:curveMember xlink:href="#_c00005"/>
</gml:Ring>
</gml:interior>
</gml:PolygonPatch>
</gml:patches>
</gml:Surface>
KSJ: Geometry Creation - Area
CONNECT. TRANSFORM. AUTOMATE.
Mapping rule for Surface
<mapping match="Surface">
<feature-type>
<literal expr="Surface" />
</feature-type>
<attributes>
<attribute>
<name><literal expr="Surface.id" /></name>
<value><extract expr="@gml:id" /></value>
</attribute>
</attributes>
<structure
matched-attributes="yes"
matched-prefix="attributes"
cardinality="*/patches/PolygonPatch{}/exterior/Ring/curveMember{}
*/patches/PolygonPatch{}/interior{}/Ring/curveMember{}" />
</mapping>
Complicated hierarchy XML structure can be
mapped to nested-structured list attribute.
Create Area geometries with a Custom
Transformer.
KSJ: Geometry Creation - Area
CONNECT. TRANSFORM. AUTOMATE.
OrientableCurve element example
<gml:OrientableCurve gml:id="_c00100002" orientation="-">
<gml:baseCurve xlink:href="#c00100002"/>
</gml:OrientableCurve>
An OrientableCurve represents a reversed Curve,
links to a Curve by its ID.
Mapping Rule for OrientableCurve
<mapping match="OrientableCurve">
<feature-type>
<literal expr="OrientableCurve" />
</feature-type>
<structure
matched-attributes="yes"
matched-prefix="attributes"
cardinality="*/+" />
</mapping>
KSJ: Geometry Creation - Area
CONNECT. TRANSFORM. AUTOMATE.
KsjAreaBuilder (Custom Transformer) creates Area geometries.
KSJ: Bus Stop (Point)
CONNECT. TRANSFORM. AUTOMATE.
KSJ: River (Line and Point)
CONNECT. TRANSFORM. AUTOMATE.
KSJ: Administrative Boundary (Area)
CONNECT. TRANSFORM. AUTOMATE.
KSJ: Resolving Incorrect Data with xfMap
Case 1
CONNECT. TRANSFORM. AUTOMATE.
Incorrect - wrong feature type/attribute names
<ksj:AdministrativeArea gml:id="gy2">
<ksj:are xlink:href="#sf2"/>
<ksj:prn>千葉県</ksj:prn>
<ksj:cn2>柏市</ksj:cn2>
…
Two Mapping rules for the same feature type
<!-- For correct schema -->
<mapping match="AdministrativeBoundary">
<feature-type>
<literal expr="AdministrativeBoundary" />
</feature-type>
<structure
matched-attributes="yes"
matched-prefix="attributes"
cardinality="*/+" />
</mapping>
<!-- For wrong schema -->
<mapping match="AdministrativeArea">
<feature-type>
<literal expr="AdministrativeBoundary" />
</feature-type>
<attributes>
<attribute>
<name><literal expr="AdministrativeBoundary.id" /></name>
<value><extract expr="@gml:id" /></value>
</attribute>
<attribute>
<name><literal expr="bounds.href" /></name>
<value><extract expr="./are[@xlink:href]" /></value>
</attribute>
<attribute>
<name><literal expr="prefectureName" /></name>
<value><extract expr="./prn" /></value>
</attribute>
<attribute>
<name><literal expr="cityName" /></name>
<value><extract expr="./cn2" /></value>
</attribute>
…
Multiple mapping rules for the same feature type are allowed
if “match” attributes (XML element names) are different.
Correct
<ksj:AdministrativeBoundary gml:id="ec00100004">
<ksj:bounds xlink:href="#a00100004"/>
<ksj:prefectureName>千葉県</ksj:prefectureName>
<ksj:cityName>柏市</ksj:cityName>
…
KSJ: Resolving Incorrect Data with xfMap
Case 2
CONNECT. TRANSFORM. AUTOMATE.
Correct
<gml:Point gml:id="p1">
<gml:pos>36.02232800 139.00306800</gml:pos>
</gml:Point>
Incorrect - wrong GML element name
<gml:Point gml:id="pt0">
<gml:position>36.08985800 139.78870900</gml:position>
</gml:Point>
Mapping rule modified for incorrect data
<mapping match="Point">
<feature-type>
<literal expr="Point" />
</feature-type>
<attributes>
<attribute>
<name><literal expr="Point.id" /></name>
<value><extract expr="@gml:id" /></value>
</attribute>
</attributes>
<geometry activate="xml-point">
<data name="data-string">
<extract expr="./pos"/>
<extract expr="./position" />
</data>
<data name="axis-order">
<literal expr="2,1" />
</data>
</geometry>
</mapping>	
 
<extract> element in xfMap generates just an
empty string if the XML path specified by “expr”
attribute doesn’t exist. This mapping rule works
for both correct data and incorrect data.
Part 2. Reading DEM in FGD
!  DEM Types
!  Data Structure
!  Sequence of Elevation Values
!  Skeleton of Workspace
!  Process of Creating Raster
!  Implementation and Performance
CONNECT. TRANSFORM. AUTOMATE.
DEM: DEM Types
Type Name	
  Cell Sizes
width x height	
 
Columns x Rows
per a Dataset	
 
Extent Sizes
width x height
5m Mesh	
  0.2 x 0.2 sec.	
  225 x 150	
  45 x 30 sec.	
 
10m Mesh	
  0.4 x 0.4 sec.	
  1125 x 750	
  450 x 300 sec.	
 
250m Mesh	
  11.25 x 7.5 sec.	
  320 x 320	
  3600 x 2400 sec.	
 
CONNECT. TRANSFORM. AUTOMATE.
Both 5m Mesh DEM and 10m Mesh DEM are covering all of Japanese
land area; 250m Mesh DEM is covering a special area only.
Ideally the workspace should be applicable to any type of
DEM.
DEM: Data Structure
CONNECT. TRANSFORM. AUTOMATE.
<?xml version="1.0" encoding="Shift_JIS"?>
<Dataset>
<DEM><coverage>
<gml:boundedBy>
<gml:Envelope srsName="fguuid:jgd2011.bl">
<gml:lowerCorner>38.916666667 139.8</gml:lowerCorner>
<gml:upperCorner>38.925 139.8125</gml:upperCorner>
</gml:Envelope>
</gml:boundedBy>
<gml:gridDomain>
<gml:Grid>
<gml:limits>
<gml:GridEnvelope>
<gml:low>0 0</gml:low>
<gml:high>224 149</gml:high>
</gml:GridEnvelope>
</gml:limits>
</gml:Grid>
</gml:gridDomain>
<gml:rangeSet>
<gml:DataBlock>
<gml:tupleList>
海水面,-9999.
海水面,-9999.
海水面,-9999.
地表面,0.63
…
地表面,6.83
地表面,6.67
地表面,6.57
</gml:tupleList>
</gml:DataBlock>
</gml:rangeSet>
<gml:coverageFunction>
<gml:GridFunction>
<gml:startPoint>108 0</gml:startPoint>
</gml:GridFunction>
</gml:coverageFunction>
</coverage></DEM>
</Dataset>	
 
Number of columns and rows:
num_columns = high{0} + 1 – low{0}
num_rows = high{1} + 1 – low{1}	
 
List of (Type, Elevation)
SRS name: “jgd2000.bl” or “jgd2011.bl”
Extents: (ymin, xmin), (ymax, xmax)	
 
Index of start point in the grid matrix:
start_col = startPoint{0}
start_row = startPoint{1}
DEM: Sequence of Elevation Values
CONNECT. TRANSFORM. AUTOMATE.
0 1 2 3 4 5 6 7 … 	
 
0
1
2
3
4
5
6
Start Column Index = 6, Start Row Index = 2 	
 
Elevation values are put in order in the turn of going to Right-Lower
from Left-Upper.
Location of the starting cell is specified by start column, row index
described in the <GridFunction> element.	
 
<gml:rangeSet>
<gml:DataBlock>
<gml:tupleList>
海水面,-9999.
海水面,-9999.
海水面,-9999.
地表面,0.63
…
地表面,6.83
地表面,6.67
地表面,6.57
</gml:tupleList>
</gml:DataBlock>
</gml:rangeSet>>
DEM: Skeleton of Workspace
CONNECT. TRANSFORM. AUTOMATE.
Dataset	
 
Extract Number of
Columns / Rows	
 
Extract Coordinates of
Lower / Upper Corner	
 
Create Raster
Origin = (0, 0)
Cell Sizes = 1 x 1
Width = Number of Columns
Height = Number of Rows	
 
Resize, Move,
Set CoordSys	
 
XML Reader
with Feature Paths	
 
Scaler
Offsetter
CoordinateSystemSetter	
 
AttributeSplitter
AttributeCreator	
 
AttributeSplitter	
 
NumericRasterizer parameter settings
Size Specification: RowsColumns
Number of Columns (cells): <num_columns>
Number of Rows (cells): <num_rows>
Ground Extents
Minimum X: 0
Minimum Y: 0
Maximum X: <num_columns>
Maximum Y: <num_rows>	
 
Scaler	
 
Offsetter	
 
(0, 0)	
 
(xmin, ymin)
DEM: Process of Creating Raster
CONNECT. TRANSFORM. AUTOMATE.
Extract Start Column / Row Index	
 
Serialize Elevation Values	
 
Create 3D Grid Points	
 
Transform 3D Points into a Raster	
 
3D Point Coordinate Calculation
Index = (0-based Index in the Sequence)
+ (Start Row Index) * (Number of Columns)
+ (Start Column Index)
Column Index = Index % (Number of Columns)
Row Index = INT(Index / (Number of Columns))
X = (Column Index) + 0.5
Y = (Number of Rows) – 0.5 – (Row Index)
Z = Elevation	
 
NumericRasterizer parameter settings
Size Specification: RowsColumns
Number of Columns (cells): <num_columns>
Number of Rows (cells): <num_rows>
Ground Extents
Minimum X: 0
Minimum Y: 0
Maximum X: <num_columns>
Maximum Y: <num_rows>	
 
Extract Number of Columns / Rows
DEM: Implementation and Performance
CONNECT. TRANSFORM. AUTOMATE.
1st Implementation: uses existing Transformers only.
About 110 sec. for rasterizing a 10m Mesh DEM (843,750 cells).
The ListExploder seems to consume long time.
DEM: Implementation and Performance
CONNECT. TRANSFORM. AUTOMATE.
2nd Implementation: uses a Python script to extract Elevation
values and create 3D Grid Points.
About 25 sec.: Performance has been improved considerably.
But there should be more efficient way. 	
 
import fmeobjects
class GridPointCreator(object):
def input(self, feature):
count = feature.getAttribute('_count')
numCols = int(feature.getAttribute('_num_columns'))
numRows = int(feature.getAttribute('_num_rows'))
startCol = int(feature.getAttribute('_start{0}'))
startRow = int(feature.getAttribute('_start{1}'))
tuples = feature.getAttribute('DEM.coverage.rangeSet.DataBlock.tupleList').strip()
index = startRow * numCols + startCol
for z in [float(t.split(',')[1]) for t in tuples.split()]:
x = index % numCols + 0.5
y = numRows - 0.5 - index / numCols
point = fmeobjects.FMEFeature()
point.setAttribute('_count', count)
point.setAttribute('_num_columns', numCols)
point.setAttribute('_num_rows', numRows)
point.setGeometry(fmeobjects.FMEPoint(x, y, z))
self.pyoutput(point)
index += 1
DEM: Implementation and Performance
CONNECT. TRANSFORM. AUTOMATE.
3rd Implementation: inserted a PointCloudCombiner to
transform 3D Points into a Point Cloud before rasterizing.
About 12 sec.: Performance has been improved further more.
Is it the best performance?	
 
Special Thanks: The Point Cloud Technology was suggested by
Dale and Chris@Safe.
DEM: Implementation and Performance
CONNECT. TRANSFORM. AUTOMATE.
Final Implementation: updated the Python script so that it will
create a 3D Line having all the 3D Grid Points as vertices.
About 2.5 sec.: Quite faster than creating many point
features.	
  import fmeobjects
def create3DLine(feature):
numCols = int(feature.getAttribute('_num_columns'))
numRows = int(feature.getAttribute('_num_rows'))
startCol = int(feature.getAttribute('_start{0}'))
startRow = int(feature.getAttribute('_start{1}'))
tuples = feature.getAttribute('DEM.coverage.rangeSet.DataBlock.tupleList').strip()
index = startRow * numCols + startCol
coords = []
for z in [float(t.split(',')[1]) for t in tuples.split()]:
x = index % numCols + 0.5
y = numRows - 0.5 - index / numCols
coords.append((x, y, z))
index += 1
feature.setGeometry(fmeobjects.FMELine(coords))
DEM: Implementation and Performance
Level	
  Processing Time	
  Comments	
 
1st 	
  110 sec. (100%)	
  Existing Transformers Only	
 
2nd 	
  25 sec. (23%)	
  Create 3D Grid Points with Python	
 
3rd 	
  12 sec. (11%)	
  Introduced the Point Cloud Technology	
 
Final	
  2.5 sec. (2.3%)	
  Create 3D Line with Python	
 
CONNECT. TRANSFORM. AUTOMATE.
Tested with FGD 10m Mesh DEM: FG-GML-5338-41-dem10b-20090201.xml
FME 2014 SP2 WIN32, Windows 7 64-bit	
 
Conclusion:
•  Python scripting is worth to consider for improving performance, especially
if the ListExploder looks inefficient.
•  Using a Point Cloud as input for the NumericRasterizer is very efficient.	
 
Summary
DEM: Implementation and Performance
CONNECT. TRANSFORM. AUTOMATE.
Rasterizing Result:	
 
Final Workspace
Thank You!
!  Questions?
!  For more information:
!  Takashi Iijima iijima@pragmatica.jp
!  Pragmatica Inc.
!  http://fme-memorandum-takashi.blogspot.jp/
CONNECT. TRANSFORM. AUTOMATE.

Contenu connexe

Similaire à FME Workspace Template Collection for Reading Fundamental Geographic Data in Japan

INAC Online Hazards Database App
INAC Online Hazards Database AppINAC Online Hazards Database App
INAC Online Hazards Database AppGerry James
 
Kopss Open API 단위테스트 이슈사항
Kopss Open API 단위테스트 이슈사항Kopss Open API 단위테스트 이슈사항
Kopss Open API 단위테스트 이슈사항MinPa Lee
 
The State of the GeoServer project
The State of the GeoServer projectThe State of the GeoServer project
The State of the GeoServer projectGeoSolutions
 
2017 PLSC Track: Using a Standard Version of ArcMap with External VRS Recieve...
2017 PLSC Track: Using a Standard Version of ArcMap with External VRS Recieve...2017 PLSC Track: Using a Standard Version of ArcMap with External VRS Recieve...
2017 PLSC Track: Using a Standard Version of ArcMap with External VRS Recieve...GIS in the Rockies
 
Graph computation
Graph computationGraph computation
Graph computationSigmoid
 
Geometric modeling111431635 geometric-modeling-glad (1)
Geometric modeling111431635 geometric-modeling-glad (1)Geometric modeling111431635 geometric-modeling-glad (1)
Geometric modeling111431635 geometric-modeling-glad (1)manojg1990
 
111431635-geometric-modeling-glad1-150630140219-lva1-app6892 (1).pdf
111431635-geometric-modeling-glad1-150630140219-lva1-app6892 (1).pdf111431635-geometric-modeling-glad1-150630140219-lva1-app6892 (1).pdf
111431635-geometric-modeling-glad1-150630140219-lva1-app6892 (1).pdfVIGNESHG144026
 
Optimizing GIS based Systems
Optimizing GIS based SystemsOptimizing GIS based Systems
Optimizing GIS based SystemsAjinkya Deshpande
 
Netflix Machine Learning Infra for Recommendations - 2018
Netflix Machine Learning Infra for Recommendations - 2018Netflix Machine Learning Infra for Recommendations - 2018
Netflix Machine Learning Infra for Recommendations - 2018Karthik Murugesan
 
ML Infra for Netflix Recommendations - AI NEXTCon talk
ML Infra for Netflix Recommendations - AI NEXTCon talkML Infra for Netflix Recommendations - AI NEXTCon talk
ML Infra for Netflix Recommendations - AI NEXTCon talkFaisal Siddiqi
 
Love Your Database Railsconf 2017
Love Your Database Railsconf 2017Love Your Database Railsconf 2017
Love Your Database Railsconf 2017gisborne
 
Optimizing Geospatial Operations with Server-side Programming in HBase and Ac...
Optimizing Geospatial Operations with Server-side Programming in HBase and Ac...Optimizing Geospatial Operations with Server-side Programming in HBase and Ac...
Optimizing Geospatial Operations with Server-side Programming in HBase and Ac...DataWorks Summit
 
State of GeoServer at FOSS4G-NA
State of GeoServer at FOSS4G-NAState of GeoServer at FOSS4G-NA
State of GeoServer at FOSS4G-NAGeoSolutions
 
Spatialware_2_Sql08
Spatialware_2_Sql08Spatialware_2_Sql08
Spatialware_2_Sql08Mike Osbourn
 
Introduction To PostGIS
Introduction To PostGISIntroduction To PostGIS
Introduction To PostGISmleslie
 

Similaire à FME Workspace Template Collection for Reading Fundamental Geographic Data in Japan (20)

The 21st Century Harvard Map
The 21st Century Harvard MapThe 21st Century Harvard Map
The 21st Century Harvard Map
 
INAC Online Hazards Database App
INAC Online Hazards Database AppINAC Online Hazards Database App
INAC Online Hazards Database App
 
Kopss Open API 단위테스트 이슈사항
Kopss Open API 단위테스트 이슈사항Kopss Open API 단위테스트 이슈사항
Kopss Open API 단위테스트 이슈사항
 
QGIS training class 1
QGIS training class 1QGIS training class 1
QGIS training class 1
 
The State of the GeoServer project
The State of the GeoServer projectThe State of the GeoServer project
The State of the GeoServer project
 
2017 PLSC Track: Using a Standard Version of ArcMap with External VRS Recieve...
2017 PLSC Track: Using a Standard Version of ArcMap with External VRS Recieve...2017 PLSC Track: Using a Standard Version of ArcMap with External VRS Recieve...
2017 PLSC Track: Using a Standard Version of ArcMap with External VRS Recieve...
 
QGIS training class 3
QGIS training class 3QGIS training class 3
QGIS training class 3
 
Graph computation
Graph computationGraph computation
Graph computation
 
Pycon2011
Pycon2011Pycon2011
Pycon2011
 
Geometric modeling111431635 geometric-modeling-glad (1)
Geometric modeling111431635 geometric-modeling-glad (1)Geometric modeling111431635 geometric-modeling-glad (1)
Geometric modeling111431635 geometric-modeling-glad (1)
 
Agi08 Jeremy Morley
Agi08 Jeremy MorleyAgi08 Jeremy Morley
Agi08 Jeremy Morley
 
111431635-geometric-modeling-glad1-150630140219-lva1-app6892 (1).pdf
111431635-geometric-modeling-glad1-150630140219-lva1-app6892 (1).pdf111431635-geometric-modeling-glad1-150630140219-lva1-app6892 (1).pdf
111431635-geometric-modeling-glad1-150630140219-lva1-app6892 (1).pdf
 
Optimizing GIS based Systems
Optimizing GIS based SystemsOptimizing GIS based Systems
Optimizing GIS based Systems
 
Netflix Machine Learning Infra for Recommendations - 2018
Netflix Machine Learning Infra for Recommendations - 2018Netflix Machine Learning Infra for Recommendations - 2018
Netflix Machine Learning Infra for Recommendations - 2018
 
ML Infra for Netflix Recommendations - AI NEXTCon talk
ML Infra for Netflix Recommendations - AI NEXTCon talkML Infra for Netflix Recommendations - AI NEXTCon talk
ML Infra for Netflix Recommendations - AI NEXTCon talk
 
Love Your Database Railsconf 2017
Love Your Database Railsconf 2017Love Your Database Railsconf 2017
Love Your Database Railsconf 2017
 
Optimizing Geospatial Operations with Server-side Programming in HBase and Ac...
Optimizing Geospatial Operations with Server-side Programming in HBase and Ac...Optimizing Geospatial Operations with Server-side Programming in HBase and Ac...
Optimizing Geospatial Operations with Server-side Programming in HBase and Ac...
 
State of GeoServer at FOSS4G-NA
State of GeoServer at FOSS4G-NAState of GeoServer at FOSS4G-NA
State of GeoServer at FOSS4G-NA
 
Spatialware_2_Sql08
Spatialware_2_Sql08Spatialware_2_Sql08
Spatialware_2_Sql08
 
Introduction To PostGIS
Introduction To PostGISIntroduction To PostGIS
Introduction To PostGIS
 

Plus de Safe Software

Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
Powering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data StreamsPowering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data StreamsSafe Software
 
The Critical Role of Spatial Data in Today's Data Ecosystem
The Critical Role of Spatial Data in Today's Data EcosystemThe Critical Role of Spatial Data in Today's Data Ecosystem
The Critical Role of Spatial Data in Today's Data EcosystemSafe Software
 
Cloud Revolution: Exploring the New Wave of Serverless Spatial Data
Cloud Revolution: Exploring the New Wave of Serverless Spatial DataCloud Revolution: Exploring the New Wave of Serverless Spatial Data
Cloud Revolution: Exploring the New Wave of Serverless Spatial DataSafe Software
 
Igniting Next Level Productivity with AI-Infused Data Integration Workflows
Igniting Next Level Productivity with AI-Infused Data Integration WorkflowsIgniting Next Level Productivity with AI-Infused Data Integration Workflows
Igniting Next Level Productivity with AI-Infused Data Integration WorkflowsSafe Software
 
The Zero-ETL Approach: Enhancing Data Agility and Insight
The Zero-ETL Approach: Enhancing Data Agility and InsightThe Zero-ETL Approach: Enhancing Data Agility and Insight
The Zero-ETL Approach: Enhancing Data Agility and InsightSafe Software
 
Mastering MicroStation DGN: How to Integrate CAD and GIS
Mastering MicroStation DGN: How to Integrate CAD and GISMastering MicroStation DGN: How to Integrate CAD and GIS
Mastering MicroStation DGN: How to Integrate CAD and GISSafe Software
 
Geospatial Synergy: Amplifying Efficiency with FME & Esri
Geospatial Synergy: Amplifying Efficiency with FME & EsriGeospatial Synergy: Amplifying Efficiency with FME & Esri
Geospatial Synergy: Amplifying Efficiency with FME & EsriSafe Software
 
Introducing the New FME Community Webinar - Feb 21, 2024 (2).pdf
Introducing the New FME Community Webinar - Feb 21, 2024 (2).pdfIntroducing the New FME Community Webinar - Feb 21, 2024 (2).pdf
Introducing the New FME Community Webinar - Feb 21, 2024 (2).pdfSafe Software
 
Breaking Barriers & Leveraging the Latest Developments in AI Technology
Breaking Barriers & Leveraging the Latest Developments in AI TechnologyBreaking Barriers & Leveraging the Latest Developments in AI Technology
Breaking Barriers & Leveraging the Latest Developments in AI TechnologySafe Software
 
Best Practices to Navigating Data and Application Integration for the Enterpr...
Best Practices to Navigating Data and Application Integration for the Enterpr...Best Practices to Navigating Data and Application Integration for the Enterpr...
Best Practices to Navigating Data and Application Integration for the Enterpr...Safe Software
 
Cloud Revolution: Exploring the New Wave of Serverless Spatial Data
Cloud Revolution: Exploring the New Wave of Serverless Spatial DataCloud Revolution: Exploring the New Wave of Serverless Spatial Data
Cloud Revolution: Exploring the New Wave of Serverless Spatial DataSafe Software
 
New Year's Fireside Chat with Safe Software’s Founders
New Year's Fireside Chat with Safe Software’s FoundersNew Year's Fireside Chat with Safe Software’s Founders
New Year's Fireside Chat with Safe Software’s FoundersSafe Software
 
Taking Off with FME: Elevating Airport Operations to New Heights
Taking Off with FME: Elevating Airport Operations to New HeightsTaking Off with FME: Elevating Airport Operations to New Heights
Taking Off with FME: Elevating Airport Operations to New HeightsSafe Software
 
Initiating and Advancing Your Strategic GIS Governance Strategy
Initiating and Advancing Your Strategic GIS Governance StrategyInitiating and Advancing Your Strategic GIS Governance Strategy
Initiating and Advancing Your Strategic GIS Governance StrategySafe Software
 
Igniting Next Level Productivity with AI-Infused Data Integration Workflows
Igniting Next Level Productivity with AI-Infused Data Integration Workflows Igniting Next Level Productivity with AI-Infused Data Integration Workflows
Igniting Next Level Productivity with AI-Infused Data Integration Workflows Safe Software
 
Geospatial Synergy: Amplifying Efficiency with FME & Esri ft. Peak Guest Spea...
Geospatial Synergy: Amplifying Efficiency with FME & Esri ft. Peak Guest Spea...Geospatial Synergy: Amplifying Efficiency with FME & Esri ft. Peak Guest Spea...
Geospatial Synergy: Amplifying Efficiency with FME & Esri ft. Peak Guest Spea...Safe Software
 
Mastering DevOps-Driven Data Integration with FME
Mastering DevOps-Driven Data Integration with FMEMastering DevOps-Driven Data Integration with FME
Mastering DevOps-Driven Data Integration with FMESafe Software
 
Identification of landscape features eligible for EU subsidy - Analysis of la...
Identification of landscape features eligible for EU subsidy - Analysis of la...Identification of landscape features eligible for EU subsidy - Analysis of la...
Identification of landscape features eligible for EU subsidy - Analysis of la...Safe Software
 
Utilizing FME as an API Test Framework
Utilizing FME as an API Test Framework Utilizing FME as an API Test Framework
Utilizing FME as an API Test Framework Safe Software
 

Plus de Safe Software (20)

Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
Powering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data StreamsPowering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data Streams
 
The Critical Role of Spatial Data in Today's Data Ecosystem
The Critical Role of Spatial Data in Today's Data EcosystemThe Critical Role of Spatial Data in Today's Data Ecosystem
The Critical Role of Spatial Data in Today's Data Ecosystem
 
Cloud Revolution: Exploring the New Wave of Serverless Spatial Data
Cloud Revolution: Exploring the New Wave of Serverless Spatial DataCloud Revolution: Exploring the New Wave of Serverless Spatial Data
Cloud Revolution: Exploring the New Wave of Serverless Spatial Data
 
Igniting Next Level Productivity with AI-Infused Data Integration Workflows
Igniting Next Level Productivity with AI-Infused Data Integration WorkflowsIgniting Next Level Productivity with AI-Infused Data Integration Workflows
Igniting Next Level Productivity with AI-Infused Data Integration Workflows
 
The Zero-ETL Approach: Enhancing Data Agility and Insight
The Zero-ETL Approach: Enhancing Data Agility and InsightThe Zero-ETL Approach: Enhancing Data Agility and Insight
The Zero-ETL Approach: Enhancing Data Agility and Insight
 
Mastering MicroStation DGN: How to Integrate CAD and GIS
Mastering MicroStation DGN: How to Integrate CAD and GISMastering MicroStation DGN: How to Integrate CAD and GIS
Mastering MicroStation DGN: How to Integrate CAD and GIS
 
Geospatial Synergy: Amplifying Efficiency with FME & Esri
Geospatial Synergy: Amplifying Efficiency with FME & EsriGeospatial Synergy: Amplifying Efficiency with FME & Esri
Geospatial Synergy: Amplifying Efficiency with FME & Esri
 
Introducing the New FME Community Webinar - Feb 21, 2024 (2).pdf
Introducing the New FME Community Webinar - Feb 21, 2024 (2).pdfIntroducing the New FME Community Webinar - Feb 21, 2024 (2).pdf
Introducing the New FME Community Webinar - Feb 21, 2024 (2).pdf
 
Breaking Barriers & Leveraging the Latest Developments in AI Technology
Breaking Barriers & Leveraging the Latest Developments in AI TechnologyBreaking Barriers & Leveraging the Latest Developments in AI Technology
Breaking Barriers & Leveraging the Latest Developments in AI Technology
 
Best Practices to Navigating Data and Application Integration for the Enterpr...
Best Practices to Navigating Data and Application Integration for the Enterpr...Best Practices to Navigating Data and Application Integration for the Enterpr...
Best Practices to Navigating Data and Application Integration for the Enterpr...
 
Cloud Revolution: Exploring the New Wave of Serverless Spatial Data
Cloud Revolution: Exploring the New Wave of Serverless Spatial DataCloud Revolution: Exploring the New Wave of Serverless Spatial Data
Cloud Revolution: Exploring the New Wave of Serverless Spatial Data
 
New Year's Fireside Chat with Safe Software’s Founders
New Year's Fireside Chat with Safe Software’s FoundersNew Year's Fireside Chat with Safe Software’s Founders
New Year's Fireside Chat with Safe Software’s Founders
 
Taking Off with FME: Elevating Airport Operations to New Heights
Taking Off with FME: Elevating Airport Operations to New HeightsTaking Off with FME: Elevating Airport Operations to New Heights
Taking Off with FME: Elevating Airport Operations to New Heights
 
Initiating and Advancing Your Strategic GIS Governance Strategy
Initiating and Advancing Your Strategic GIS Governance StrategyInitiating and Advancing Your Strategic GIS Governance Strategy
Initiating and Advancing Your Strategic GIS Governance Strategy
 
Igniting Next Level Productivity with AI-Infused Data Integration Workflows
Igniting Next Level Productivity with AI-Infused Data Integration Workflows Igniting Next Level Productivity with AI-Infused Data Integration Workflows
Igniting Next Level Productivity with AI-Infused Data Integration Workflows
 
Geospatial Synergy: Amplifying Efficiency with FME & Esri ft. Peak Guest Spea...
Geospatial Synergy: Amplifying Efficiency with FME & Esri ft. Peak Guest Spea...Geospatial Synergy: Amplifying Efficiency with FME & Esri ft. Peak Guest Spea...
Geospatial Synergy: Amplifying Efficiency with FME & Esri ft. Peak Guest Spea...
 
Mastering DevOps-Driven Data Integration with FME
Mastering DevOps-Driven Data Integration with FMEMastering DevOps-Driven Data Integration with FME
Mastering DevOps-Driven Data Integration with FME
 
Identification of landscape features eligible for EU subsidy - Analysis of la...
Identification of landscape features eligible for EU subsidy - Analysis of la...Identification of landscape features eligible for EU subsidy - Analysis of la...
Identification of landscape features eligible for EU subsidy - Analysis of la...
 
Utilizing FME as an API Test Framework
Utilizing FME as an API Test Framework Utilizing FME as an API Test Framework
Utilizing FME as an API Test Framework
 

Dernier

Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxLoriGlavin3
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxLoriGlavin3
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersRaghuram Pandurangan
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionDilum Bandara
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 

Dernier (20)

Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information Developers
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An Introduction
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 

FME Workspace Template Collection for Reading Fundamental Geographic Data in Japan

  • 1. CONNECT. TRANSFORM. AUTOMATE. FME Workspace Template Collection for Reading Fundamental Geographic Data in Japan Takashi Iijima   FME Certified Professional, pragmatica inc.
  • 2. Background: KSJ and FGD Major Fundamental Geographic Datasets provided by Japanese Governmental Organizations KSJ: 国⼟土数値情報  (Kokudo Suuchi Jouho) National Land Numerical Information FGD: 基盤地図情報  (Kiban Chizu Jouho) Fundamental Geospatial Data CONNECT. TRANSFORM. AUTOMATE.
  • 3. Background: KSJ Overview !  Provider: 国⼟土交通省省  -- Ministry of Land, Infrastructure, Transport and Tourism (MLIT) !  http://nlftp.mlit.go.jp/ksj/ !  Feature Types: 60+; Geographic Features, Land Use, Political Designated Zones, Administrative Areas, Public Facilities, Transportation Facilities etc. (Point, Line or Area) !  Format: XML conforming to GML !  GML reader cannot read the data. CONNECT. TRANSFORM. AUTOMATE.
  • 4. Background: FGD Overview !  Provider: 国⼟土地理理院  -- Geospatial Information Authority of Japan (GSI) !  http://www.gsi.go.jp/kiban/etsuran.html !  Feature Types: Vectorized Topographical Map Elements (Point, Line or Area), Survey Reference Point, Digital Elevation Model (DEM) !  Format: XML conforming to GML !  GML reader can read the data except DEM. CONNECT. TRANSFORM. AUTOMATE.
  • 5. Project Overview !  Purpose: To provide easy and flexible way to read KSJ and DEM in FGD with FME to increase their usability. !  Approach: Create FME workspaces to read the datasets with the XML reader and create features having appropriate geometry and attributes. !  Goal: FME Template Collection CONNECT. TRANSFORM. AUTOMATE.
  • 6. Part 1. Reading KSJ !  General Data Structure !  Framework of Workspaces !  Geometry Creation – Point !  Geometry Creation – Line !  Geometry Creation – Area !  Resolving Incorrect Data with xfMap CONNECT. TRANSFORM. AUTOMATE.
  • 7. <?xml version="1.0" encoding="UTF-8"?> <ksj:Dataset> <gml:boundedBy> <gml:EnvelopeWithTimePeriod srsName="JGD2000 / (B, L)" frame="GC / JST"> <gml:lowerCorner>20.0 123.0</gml:lowerCorner> <gml:upperCorner>46.0 154.0</gml:upperCorner> <gml:beginPosition calendarEraName="西暦">1900</gml:beginPosition> <gml:endPosition indeterminatePosition="unknown"/> </gml:EnvelopeWithTimePeriod> </gml:boundedBy> <gml:Point gml:id="n1"> <gml:pos>34.98509412 139.86044116</gml:pos> </gml:Point> <ksj:BusStop gml:id="ED01_1"> <ksj:position xlink:href="#n1"/> <ksj:busStopName>西下町</ksj:busStopName> <ksj:busRouteInformation> <ksj:BusRouteInformation> <ksj:busType>1</ksj:busType> <ksj:busOperationCompany>JRバス関東(株)</ksj:busOperationCompany> <ksj:busLineName>フラワー号</ksj:busLineName> </ksj:BusRouteInformation> </ksj:busRouteInformation> </ksj:BusStop> </ksj:Dataset> KSJ: General Data Structure CONNECT. TRANSFORM. AUTOMATE. Envelope Geometries Features GML: Point, Curve, OrientableCurve, Surface A feature links to a geometry via "href" attribute. Contains SRS name: JGD2000 or Tokyo Datum
  • 8. KSJ: Framework of Workspaces CONNECT. TRANSFORM. AUTOMATE. Merge Features Geometries Envelope (SRS) Merge Set coordinate system Modify attribute names XML Reader feature type with Feature Type Specific xfMap XML Reader feature type with Common xfMap Creates geometries (Line, Area) with Custom Transformer XML Reader feature type created with Common xfMap Add geometry to feature Group By: fme_basename Join On: geometry ID Add SRS name to feature Group By: fme_basename Unconditional merging
  • 9. KSJ: Geometry Creation - Point Mapping rule for <Point> <mapping match="Point"> <feature-type> <literal expr="Point" /> </feature-type> <attributes> <attribute> <name><literal expr="Point.id" /></name> <value><extract expr="@gml:id" /></value> </attribute> </attributes> <geometry activate="xml-point"> <data name="data-string"> <extract expr="./pos"/> </data> <data name="axis-order"> <literal expr="2,1" /> </data> </geometry> </mapping> CONNECT. TRANSFORM. AUTOMATE. <Point> element example <gml:Point gml:id="p1"> <gml:pos>36.02232800 139.00306800</gml:pos> </gml:Point> <gml:Point gml:id="p2"> <gml:pos>36.01240300 139.02192100</gml:pos> </gml:Point> <gml:Point gml:id="p3"> <gml:pos>36.04452300 139.05435900</gml:pos> </gml:Point> <gml:Point gml:id="p4"> <gml:pos>35.98977700 139.07710600</gml:pos> </gml:Point> <gml:Point gml:id="p5"> <gml:pos>35.99583200 139.07745600</gml:pos> </gml:Point> Points can be created simply with xfMap.
  • 10. KSJ: Geometry Creation - Line CONNECT. TRANSFORM. AUTOMATE. Read <LineStringSegment> elements as XML fragments. Create Line geometries with a Custom Transformer. Mapping rule for <Curve> <mapping match="Curve"> <feature-type> <literal expr="Curve" /> </feature-type> <attributes> <attribute> <name><literal expr="Curve.id" /></name> <value><extract expr="@gml:id" /></value> </attribute> <attribute type="list"> <name><literal expr="LineStringSegment" /></name> <value> <extract expr="./segments/LineStringSegment" as-xml="true" /> </value> </attribute> </attributes> </mapping> <Curve> element example <gml:Curve gml:id="c-85"> <gml:segments> <gml:LineStringSegment> <gml:posList> 35.91887573 139.92888998 35.91885861 139.92893361 35.91885472 139.92894500 35.91885472 139.92895778 35.91887972 139.92899667 35.91925667 139.92939778 35.91927722 139.92945889 </gml:posList> </gml:LineStringSegment> </gml:segments> </gml:Curve>
  • 11. KSJ: Geometry Creation - Line CONNECT. TRANSFORM. AUTOMATE. KsjLineBuilder (Custom Transformer) creates Line geometries.
  • 12. Surface element example <gml:Surface gml:id="a00001"> <gml:patches> <gml:PolygonPatch> <gml:exterior> <gml:Ring> <gml:curveMember xlink:href="#_c00003"/> <gml:curveMember xlink:href="#_c00002"/> <gml:curveMember xlink:href="#_c00001"/> </gml:Ring> </gml:exterior> <gml:interior> <gml:Ring> <gml:curveMember xlink:href="#_c00004"/> </gml:Ring> </gml:interior> <gml:interior> <gml:Ring> <gml:curveMember xlink:href="#_c00005"/> </gml:Ring> </gml:interior> </gml:PolygonPatch> </gml:patches> </gml:Surface> KSJ: Geometry Creation - Area CONNECT. TRANSFORM. AUTOMATE. Mapping rule for Surface <mapping match="Surface"> <feature-type> <literal expr="Surface" /> </feature-type> <attributes> <attribute> <name><literal expr="Surface.id" /></name> <value><extract expr="@gml:id" /></value> </attribute> </attributes> <structure matched-attributes="yes" matched-prefix="attributes" cardinality="*/patches/PolygonPatch{}/exterior/Ring/curveMember{} */patches/PolygonPatch{}/interior{}/Ring/curveMember{}" /> </mapping> Complicated hierarchy XML structure can be mapped to nested-structured list attribute. Create Area geometries with a Custom Transformer.
  • 13. KSJ: Geometry Creation - Area CONNECT. TRANSFORM. AUTOMATE. OrientableCurve element example <gml:OrientableCurve gml:id="_c00100002" orientation="-"> <gml:baseCurve xlink:href="#c00100002"/> </gml:OrientableCurve> An OrientableCurve represents a reversed Curve, links to a Curve by its ID. Mapping Rule for OrientableCurve <mapping match="OrientableCurve"> <feature-type> <literal expr="OrientableCurve" /> </feature-type> <structure matched-attributes="yes" matched-prefix="attributes" cardinality="*/+" /> </mapping>
  • 14. KSJ: Geometry Creation - Area CONNECT. TRANSFORM. AUTOMATE. KsjAreaBuilder (Custom Transformer) creates Area geometries.
  • 15. KSJ: Bus Stop (Point) CONNECT. TRANSFORM. AUTOMATE.
  • 16. KSJ: River (Line and Point) CONNECT. TRANSFORM. AUTOMATE.
  • 17. KSJ: Administrative Boundary (Area) CONNECT. TRANSFORM. AUTOMATE.
  • 18. KSJ: Resolving Incorrect Data with xfMap Case 1 CONNECT. TRANSFORM. AUTOMATE. Incorrect - wrong feature type/attribute names <ksj:AdministrativeArea gml:id="gy2"> <ksj:are xlink:href="#sf2"/> <ksj:prn>千葉県</ksj:prn> <ksj:cn2>柏市</ksj:cn2> … Two Mapping rules for the same feature type <!-- For correct schema --> <mapping match="AdministrativeBoundary"> <feature-type> <literal expr="AdministrativeBoundary" /> </feature-type> <structure matched-attributes="yes" matched-prefix="attributes" cardinality="*/+" /> </mapping> <!-- For wrong schema --> <mapping match="AdministrativeArea"> <feature-type> <literal expr="AdministrativeBoundary" /> </feature-type> <attributes> <attribute> <name><literal expr="AdministrativeBoundary.id" /></name> <value><extract expr="@gml:id" /></value> </attribute> <attribute> <name><literal expr="bounds.href" /></name> <value><extract expr="./are[@xlink:href]" /></value> </attribute> <attribute> <name><literal expr="prefectureName" /></name> <value><extract expr="./prn" /></value> </attribute> <attribute> <name><literal expr="cityName" /></name> <value><extract expr="./cn2" /></value> </attribute> … Multiple mapping rules for the same feature type are allowed if “match” attributes (XML element names) are different. Correct <ksj:AdministrativeBoundary gml:id="ec00100004"> <ksj:bounds xlink:href="#a00100004"/> <ksj:prefectureName>千葉県</ksj:prefectureName> <ksj:cityName>柏市</ksj:cityName> …
  • 19. KSJ: Resolving Incorrect Data with xfMap Case 2 CONNECT. TRANSFORM. AUTOMATE. Correct <gml:Point gml:id="p1"> <gml:pos>36.02232800 139.00306800</gml:pos> </gml:Point> Incorrect - wrong GML element name <gml:Point gml:id="pt0"> <gml:position>36.08985800 139.78870900</gml:position> </gml:Point> Mapping rule modified for incorrect data <mapping match="Point"> <feature-type> <literal expr="Point" /> </feature-type> <attributes> <attribute> <name><literal expr="Point.id" /></name> <value><extract expr="@gml:id" /></value> </attribute> </attributes> <geometry activate="xml-point"> <data name="data-string"> <extract expr="./pos"/> <extract expr="./position" /> </data> <data name="axis-order"> <literal expr="2,1" /> </data> </geometry> </mapping> <extract> element in xfMap generates just an empty string if the XML path specified by “expr” attribute doesn’t exist. This mapping rule works for both correct data and incorrect data.
  • 20. Part 2. Reading DEM in FGD !  DEM Types !  Data Structure !  Sequence of Elevation Values !  Skeleton of Workspace !  Process of Creating Raster !  Implementation and Performance CONNECT. TRANSFORM. AUTOMATE.
  • 21. DEM: DEM Types Type Name Cell Sizes width x height Columns x Rows per a Dataset Extent Sizes width x height 5m Mesh 0.2 x 0.2 sec. 225 x 150 45 x 30 sec. 10m Mesh 0.4 x 0.4 sec. 1125 x 750 450 x 300 sec. 250m Mesh 11.25 x 7.5 sec. 320 x 320 3600 x 2400 sec. CONNECT. TRANSFORM. AUTOMATE. Both 5m Mesh DEM and 10m Mesh DEM are covering all of Japanese land area; 250m Mesh DEM is covering a special area only. Ideally the workspace should be applicable to any type of DEM.
  • 22. DEM: Data Structure CONNECT. TRANSFORM. AUTOMATE. <?xml version="1.0" encoding="Shift_JIS"?> <Dataset> <DEM><coverage> <gml:boundedBy> <gml:Envelope srsName="fguuid:jgd2011.bl"> <gml:lowerCorner>38.916666667 139.8</gml:lowerCorner> <gml:upperCorner>38.925 139.8125</gml:upperCorner> </gml:Envelope> </gml:boundedBy> <gml:gridDomain> <gml:Grid> <gml:limits> <gml:GridEnvelope> <gml:low>0 0</gml:low> <gml:high>224 149</gml:high> </gml:GridEnvelope> </gml:limits> </gml:Grid> </gml:gridDomain> <gml:rangeSet> <gml:DataBlock> <gml:tupleList> 海水面,-9999. 海水面,-9999. 海水面,-9999. 地表面,0.63 … 地表面,6.83 地表面,6.67 地表面,6.57 </gml:tupleList> </gml:DataBlock> </gml:rangeSet> <gml:coverageFunction> <gml:GridFunction> <gml:startPoint>108 0</gml:startPoint> </gml:GridFunction> </gml:coverageFunction> </coverage></DEM> </Dataset> Number of columns and rows: num_columns = high{0} + 1 – low{0} num_rows = high{1} + 1 – low{1} List of (Type, Elevation) SRS name: “jgd2000.bl” or “jgd2011.bl” Extents: (ymin, xmin), (ymax, xmax) Index of start point in the grid matrix: start_col = startPoint{0} start_row = startPoint{1}
  • 23. DEM: Sequence of Elevation Values CONNECT. TRANSFORM. AUTOMATE. 0 1 2 3 4 5 6 7 … 0 1 2 3 4 5 6 Start Column Index = 6, Start Row Index = 2 Elevation values are put in order in the turn of going to Right-Lower from Left-Upper. Location of the starting cell is specified by start column, row index described in the <GridFunction> element. <gml:rangeSet> <gml:DataBlock> <gml:tupleList> 海水面,-9999. 海水面,-9999. 海水面,-9999. 地表面,0.63 … 地表面,6.83 地表面,6.67 地表面,6.57 </gml:tupleList> </gml:DataBlock> </gml:rangeSet>>
  • 24. DEM: Skeleton of Workspace CONNECT. TRANSFORM. AUTOMATE. Dataset Extract Number of Columns / Rows Extract Coordinates of Lower / Upper Corner Create Raster Origin = (0, 0) Cell Sizes = 1 x 1 Width = Number of Columns Height = Number of Rows Resize, Move, Set CoordSys XML Reader with Feature Paths Scaler Offsetter CoordinateSystemSetter AttributeSplitter AttributeCreator AttributeSplitter NumericRasterizer parameter settings Size Specification: RowsColumns Number of Columns (cells): <num_columns> Number of Rows (cells): <num_rows> Ground Extents Minimum X: 0 Minimum Y: 0 Maximum X: <num_columns> Maximum Y: <num_rows> Scaler Offsetter (0, 0) (xmin, ymin)
  • 25. DEM: Process of Creating Raster CONNECT. TRANSFORM. AUTOMATE. Extract Start Column / Row Index Serialize Elevation Values Create 3D Grid Points Transform 3D Points into a Raster 3D Point Coordinate Calculation Index = (0-based Index in the Sequence) + (Start Row Index) * (Number of Columns) + (Start Column Index) Column Index = Index % (Number of Columns) Row Index = INT(Index / (Number of Columns)) X = (Column Index) + 0.5 Y = (Number of Rows) – 0.5 – (Row Index) Z = Elevation NumericRasterizer parameter settings Size Specification: RowsColumns Number of Columns (cells): <num_columns> Number of Rows (cells): <num_rows> Ground Extents Minimum X: 0 Minimum Y: 0 Maximum X: <num_columns> Maximum Y: <num_rows> Extract Number of Columns / Rows
  • 26. DEM: Implementation and Performance CONNECT. TRANSFORM. AUTOMATE. 1st Implementation: uses existing Transformers only. About 110 sec. for rasterizing a 10m Mesh DEM (843,750 cells). The ListExploder seems to consume long time.
  • 27. DEM: Implementation and Performance CONNECT. TRANSFORM. AUTOMATE. 2nd Implementation: uses a Python script to extract Elevation values and create 3D Grid Points. About 25 sec.: Performance has been improved considerably. But there should be more efficient way. import fmeobjects class GridPointCreator(object): def input(self, feature): count = feature.getAttribute('_count') numCols = int(feature.getAttribute('_num_columns')) numRows = int(feature.getAttribute('_num_rows')) startCol = int(feature.getAttribute('_start{0}')) startRow = int(feature.getAttribute('_start{1}')) tuples = feature.getAttribute('DEM.coverage.rangeSet.DataBlock.tupleList').strip() index = startRow * numCols + startCol for z in [float(t.split(',')[1]) for t in tuples.split()]: x = index % numCols + 0.5 y = numRows - 0.5 - index / numCols point = fmeobjects.FMEFeature() point.setAttribute('_count', count) point.setAttribute('_num_columns', numCols) point.setAttribute('_num_rows', numRows) point.setGeometry(fmeobjects.FMEPoint(x, y, z)) self.pyoutput(point) index += 1
  • 28. DEM: Implementation and Performance CONNECT. TRANSFORM. AUTOMATE. 3rd Implementation: inserted a PointCloudCombiner to transform 3D Points into a Point Cloud before rasterizing. About 12 sec.: Performance has been improved further more. Is it the best performance? Special Thanks: The Point Cloud Technology was suggested by Dale and Chris@Safe.
  • 29. DEM: Implementation and Performance CONNECT. TRANSFORM. AUTOMATE. Final Implementation: updated the Python script so that it will create a 3D Line having all the 3D Grid Points as vertices. About 2.5 sec.: Quite faster than creating many point features. import fmeobjects def create3DLine(feature): numCols = int(feature.getAttribute('_num_columns')) numRows = int(feature.getAttribute('_num_rows')) startCol = int(feature.getAttribute('_start{0}')) startRow = int(feature.getAttribute('_start{1}')) tuples = feature.getAttribute('DEM.coverage.rangeSet.DataBlock.tupleList').strip() index = startRow * numCols + startCol coords = [] for z in [float(t.split(',')[1]) for t in tuples.split()]: x = index % numCols + 0.5 y = numRows - 0.5 - index / numCols coords.append((x, y, z)) index += 1 feature.setGeometry(fmeobjects.FMELine(coords))
  • 30. DEM: Implementation and Performance Level Processing Time Comments 1st 110 sec. (100%) Existing Transformers Only 2nd 25 sec. (23%) Create 3D Grid Points with Python 3rd 12 sec. (11%) Introduced the Point Cloud Technology Final 2.5 sec. (2.3%) Create 3D Line with Python CONNECT. TRANSFORM. AUTOMATE. Tested with FGD 10m Mesh DEM: FG-GML-5338-41-dem10b-20090201.xml FME 2014 SP2 WIN32, Windows 7 64-bit Conclusion: •  Python scripting is worth to consider for improving performance, especially if the ListExploder looks inefficient. •  Using a Point Cloud as input for the NumericRasterizer is very efficient. Summary
  • 31. DEM: Implementation and Performance CONNECT. TRANSFORM. AUTOMATE. Rasterizing Result: Final Workspace
  • 32. Thank You! !  Questions? !  For more information: !  Takashi Iijima iijima@pragmatica.jp !  Pragmatica Inc. !  http://fme-memorandum-takashi.blogspot.jp/ CONNECT. TRANSFORM. AUTOMATE.