Presentation from a three hour session at the MUGUKI MapInfo User Group meeting in London June 25th.
During this session I covered how to setup a spatial database to be used from MapInfo Professional and a number of the benefits of using a spatial database.
We looked at how to:
- prepare a database to be used by MapInfo Professional
- access a spatial database from MapInfo Professional
- upload data to the spatial database using EasyLoader
- open tables from a spatial database from MapInfo Professional
- create views in a spatial database
- implement some triggers in the spatial database
- take advantage of the spatial database from MapBasic
Professional Resume Template for Software Developers
Â
MapInfo Professional 12.0 and SQL Server 2008
1. Every connection is a new opportunityâ˘
MapInfo User Group UK & Ireland
Working with MapInfo Professional
and Spatial Databases
Peter Horsbøll Møller
GIS/LI Pre-Sales Specialist
June, 2014
2. Every connection is a new opportunityâ˘
Agenda
How to setup a spatial database to be used by MapInfo
Professional 12.0
How to work with a spatial database from MapInfo
Professional 12.0
How to take advantage of a spatial database in general
3. Every connection is a new opportunityâ˘
A few words about myself
Live in Denmark with my family
Worked with the largest Danish partner from 1996 until 2008
where I were developing MapBasic applications, doing
training and support.
Worked on a number of project using Oracle and SQL Server
with SpatialWare (R.I.P.)
Have been working with Pitney Bowes Software for the last 6
years as a pre-sales specialist
Moderator and an active member on the MapInfo-L
Feel free to connect: dk.linkedin.com/in/peterhorsbollmoller/
4. Every connection is a new opportunityâ˘
The tools
MapInfo Professional 12.0, no introduction required
EasyLoader, our tool for uploading tables to spatial
databases
SQL Server 2008, the spatial database
SQL Server Management Studio, the management
interface to the database
8. Every connection is a new opportunityâ˘
A few words on login and users
In most cases you will use Windwos Authentication and
use the Windows usernames (and Active Directory)
This letâs you assign permissions to a AD group or a single
Windows user
The SQL Server users can be used for giving a certain
application access
11. Every connection is a new opportunityâ˘
What is a schema in SQL Server?
A schema in SQL Server is a way to organise for instance
your tables
Schemaes also lets you assign permission to a number of
tables, by assigning permissions to the schema in stead
of directly to the tables
You can use Schemaes as a way of organising your tables
instead of using several databases
When you access the database from MapInfo Professional
you can in the Open dialog choose what Schema you
want to browse. In this way you can limit the number of
tables shown in the dialog.
13. Every connection is a new opportunityâ˘
Creating a ODBC Data source
Data
Data
14. Every connection is a new opportunityâ˘
Creating a SQL Server 2008 data source
Data sources can be created manually or in a centralised
way
They can be stored in files or in the registry
For MapInfo Professional 32bit, the ODBC data source
must be created as 32bit data sources
For SQL Server 2008 you should use:
âSQL Server Native Client 10.0â driver
For SQL Server 2012 and Windows7 you should use:
âSQL Server Native Client 11.0â driver
15. Every connection is a new opportunityâ˘
MARS connection
Multiple Active Result Sets (MARS)
Supported
ď§ MapInfo Professional 10.5.2
ď§ SQLServer 2005, 2008 & 2012
MapInfo Professional will by default add this string to the connection
string:
ď§ âMARS Connection=trueâ
Improved performance when access a table, especially using Live with
Cache. Access can be 5-10 times faster.
16. Every connection is a new opportunityâ˘
Creating a SQL Server 2008 data source
18. Every connection is a new opportunityâ˘
Map Catalog
The Map Catalog (MapInfo.MapInfo_MapCatalog) describes spatial
tables in the database with values like:
ď§ Kind of spatial table, for example. XY, SpatialWare, Oracle, SQL
Server, PostgreSQL/PostGIS, etc.
ď§ Coordinate system
ď§ Data bounds
ď§ Symbol, default and per row
ď§ Default view
⢠The Map Catalog must exist once in the
databases holding spatial data, that is to be
accessed by MapInfo Professional
19. Every connection is a new opportunityâ˘
Map Catalog â Spatial type
Data storage
ď§ 1 : MapInfo Code, XY with MapInfo key (3 columns)
ď§ 4 : XY stored in two columns
ď§ 13: Oracle Spatial
ď§ 14: MapInfo SpatialWare for MS SQL Server
ď§ 17: SQL Server 2008 Geometry
ď§ 18: SQL Server 2008 Geography
ď§ 19: PostgreSQL/PostGIS
Object types
ď§ .0: Only Points
ď§ .1: Only Lines/Polylines
ď§ .2: Only Regions/Polygons
ď§ .3: Mixture of object types is possible
20. Every connection is a new opportunityâ˘
Creating the Map Catalog
You can create the Map Catalog using EasyLoader, directly
in the database using SQL or you can use the DBMS
Catalog tool
The user creating the Map Catalog using EasyLoader
needs a sysadmin server role.
If you create the Map Catalog using EasyLoader, make
sure that you close all connections to the database
before creating the Map Catalog. If not you might have
issues using the Per Row Style option when making
DBMS tables mappable.
21. Every connection is a new opportunityâ˘
Creating the Map Catalog â EasyLoader
23. Every connection is a new opportunityâ˘
Creating tables
You can create tables manually thru the Management
Studio
Or thru MapInfo Professional
If you use MapInfo Professional it will do a number of
things automatically for you, like adding the table to the
MapCatalog, creating spatial index and primary index.
24. Every connection is a new opportunityâ˘
Creating tables â data types
Exact numerics
ď§ Bigint (MapInfo type: Float)
â -9.223.372.036.854.775.808 â 9.223.372.036.854.775.807
ď§ Int (MapInfo type: Integer)
â -2.147.483.648 â 2.147.483.647
ď§ SmallInt (MapInfo type: SmallInt)
â -32.768 â 32.767
ď§ TinyInt (MapInfo type: SmallInt)
â 0 â 255
ď§ Bit (MapInfo type: Logical)
â 1 or 0
ď§ Decimal / numerical (MapInfo type: Decimal)
â -10^38 +1 â 10^38 â1
25. Every connection is a new opportunityâ˘
Creating tables â data types
Approximate Numerics
ď§ Float (MapInfo type: Float)
ď§ Real (MapInfo type: Float)
Date and time
ď§ Datetime (MapInfo type: DateTime)
â From January 1, 1753, through December 31, 9999, with an
accuracy of three-hundredths of a second, or 3,33
milliseconds
ď§ Date (MapInfo type: Date)
â From January 1, 1 A.D. through December 31, 9999 A.D.
26. Every connection is a new opportunityâ˘
Creating tables â data types
Character strings
ď§ Char (MapInfo type: Char)
â Fixed-length non-Unicode data, max. 8.000 characters
ď§ VarChar (MapInfo type: Char)
â Variable-length non-Unicode data, max. 8.000 characters
ď§ Text (MapInfo type: Char)
â Variable-length non-Unicode data, max. 2,147,483,647
characters
Note: Character columns longer than 254 will be made read-only when
opened in MapInfo Professional and they will only show the first 254
characters
27. Every connection is a new opportunityâ˘
Creating tables â data types
Spatial types
ď§ Geometry (MapInfo type: Object)
â Does require the table to be registered in the MapCatalog,
more on this later
ď§ Geography (MapInfo type: Object)
â Does require the table to be registered in the MapCatalog,
more on this later
28. Every connection is a new opportunityâ˘
Creating a table - naming
Consider only using the characters A â Z and the numbers 0 â 9 and
underscores (_) when naming your tables
Use the same naming convention for columns
SQL Server does however support national characters, spaces and
some other special characters.
SQL Server has a list of reserved words that canât be used as table or
column names, see the complete list here:
ď§ http://technet.microsoft.com/en-us/library/ms189822.aspx
If the tables must be used from MapInfo Professional itâs recommended
to limit the names to 31 characters
Also note that the columns for table and column names in the
MapCatalog is limited to 32 characters. If you want to use longer
names, you need to extend these
29. Every connection is a new opportunityâ˘
Creating tables â considerations
Avoid the unicode column types (nchar, nvarchar, ntext) as MapInfo
Professional canât edit these
Avoid creating character string column wider than 254 as MapInfo
Professional canât edit these
Consider naming your Primary key column MI_PRINX. MapInfo
Professional will use this as the primary key in views
Consider adding Identity columns to all your table for the Primary Index
column. This will automatically update this column with unique
values when inserting new records (similar to AutoNumber in MS
Access)
30. Every connection is a new opportunityâ˘
Creating tables thru Management Studio
31. Every connection is a new opportunityâ˘
Create a new table thru MapInfo Pro
You can create a new table in SQL Server directly
from MapInfo Professional.
MapInfo Professional will automatically add this
new table to the MapInfo MapCatalog in the
database.
MapInfo Professional will also guide you thru the
choises when making the table mappable and
adding a primary index column to the table
34. Every connection is a new opportunityâ˘
EasyLoader
EasyLoader âŚ
⌠is provided with MapInfo Professional. It can also be
downloaded from our website
⌠is a standalone application that can run outside of
MapInfo Professional
⌠is a Windows application but it can connect to databases
running on other operating systems
⌠can be run in batch mode
ď§ command prompt
ď§ bat file
ď§ program
36. Every connection is a new opportunityâ˘
Using EasyLoader as a batch uploader
Samples on how to pass parameters to EasyLoader for doing batch uploads
Upload a single table
ď§ âC:ProgramMapInfoProfessionalToolseasyloader.exeâ
/B dbo /E /F c:ezload.log /G /K /P R
/S DSN=GIS;UID=AdminUK;PWD=Admin
/Q /Y MI_STYLE
/T C:MapsAddresses.tab;Addresses
Upload multiple tables using a text file
ď§ âC:ProgramMapInfoProfessionalToolseasyloader.exeâ
/B MAPS /E /F c:ezload.log /G /K /P R
/S DSN=GIS;UID=AdminUK;PWD=Admin
/Q /Y MI_STYLE
/L C:tabfiles.txt
Makes it easy to rerun the uploads!
37. Every connection is a new opportunityâ˘
Uploading thru EasyLoader - batchmode
38. Every connection is a new opportunityâ˘
Upload using Save as
Within MapInfo Professional you can save your table
directly to the data using File > Save Copy asâŚ
Make sure you select the database connection in the file
type drop down list
Enter the name of the server table
Enter the name of the tab file (using Live connection)
⢠Will automatically add:
â MI_PRINX
â MI_STYLE
39. Every connection is a new opportunityâ˘
MapBasic syntax for Save as
The MapBasic syntax for saving table to a database looks
like this:
Commit Table AV97_W
As "C:DBMSBuildings.tab"
Type ODBC Connection 1
Table """dbo""."âBuildings"""
Type SQLServerSpatial Geometry
ConvertDateTime ON Interactive
Some of the parameters are optional
41. Every connection is a new opportunityâ˘
Spatial errors
Certain objects from MapInfo tabellens can result in errors. It can be a
good idea to run queries like these to find obvious issues:
Regions with an area of less than 1 sq meter
Select * From MY_TABLE
Where Str$(ObjectInfo(OBJ, 1)) In (â7â, â8â, â9â)
And CartesianArea(OBJ, âsq mâ) < 1
Into __POSSIBLE_ISSUES_REGIONS
Lines with a length of less than 1 meter
Select * From MY_TABLE
Where Str$(ObjectInfo(OBJ, 1)) In (â3â, â4â)
And CartesianObjectLen(OBJ, âmâ) < 1
Into __POSSIBLE_ISSUES_LINES
42. Every connection is a new opportunityâ˘
Opening tables into MapInfo Professional
43. Every connection is a new opportunityâ˘
Opening a remote table
Select File > Open
Click on Open DBMS Connection or select the open
connection in the Files of Type dropdown list
Select the schema
Check the table(s) to open
Select Linked or Live (with Cache)
44. Every connection is a new opportunityâ˘
Opening DBMS tables into MapInfo Pro
45. Every connection is a new opportunityâ˘
Reopening a remote table
Itâs only the first time you open a DBMS table, that you need to specify
which data to open
Afterwards you can reopen this table by opening the tab file
The tab file contains all the necessary information
ď§ Table structure
ď§ Connection information
ď§ Can also hold the Username and Password
If the table was opened as âLinkedâ, you may want to refresh the data.
If the table was opened as âLiveâ, MapInfo will read the latest data from
the database
46. Every connection is a new opportunityâ˘
Meta data section - Linked
!table
!version 400
!charset WindowsLatin1
Definition Table
Type LINKED Charset "WindowsLatin1"
Fields 4
MI_PRINX Integer ReadOnly ;
PLACENAME Char (50) ;
DESCRIPTION Char (250) ;
TYPE Char (20) ;
begin_metadata
"DATALINK" = ""
"DATALINKConnectionString" = "DSN=GIS2;Description=SQL Server
2008 GIS database;UID=AdminUser;APP=MapInfo
ProfessionalÂŽ;WSID=DKMP12948"
"DATALINKQuery" = "select ""MI_PRINX"", ""PLACENAME"",
""DESCRIPTION"", ""TYPE"", ""OBJECT"" from
""GIS"".""dbo"".""PointsOfInterest"""
"IsReadOnly" = "FALSE"
end_metadata
47. Every connection is a new opportunityâ˘
Meta data section - Live
!table
!version 500
!charset WindowsLatin1
Definition Table
Type ODBC
begin_metadata
"IsReadOnly" = "FALSE"
"DATALINK" = ""
"DATALINKQuery" = "Select * From
""GIS"".""dbo"".""PointsOfInterest"""
"DATALINKConnectionString" = "DSN=GIS2;Description=SQL Server
2008 GIS database;UID=AdminUser;APP=MapInfo
ProfessionalÂŽ;WSID=DKMP12948"
"DATALINKToolKit" = "ODBC"
"CACHE" = "ON"
"MBRSEARCH" = "ON"
end_metadata
49. Every connection is a new opportunityâ˘
Linked
⢠Data is copied to the MapInfo table the when you create the linked
table and when you refresh it
⢠Access to the database is only needed when saving or refreshing ->
working offline and long transactions are built in so your data is
locally available
⢠Speed is as fast as local data after download
⢠Data can be accessed read-only without a primary key
⢠Using a query to get just the data you need, will speed up download
time. Queries are set when you create the linked table via the Row,
Column or Expert dialogs
⢠Data is downloaded to the same location as the .TAB file
⢠Duplicate data
50. Every connection is a new opportunityâ˘
Live with/without cache
⢠First time opening a table may be faster â depending on the zoom of
your map window
⢠One âview entire layerâ or zoom out to the entire view will download
the whole table
⢠Data must have a primary key
⢠You always need access to the database
51. Every connection is a new opportunityâ˘
Live without cache
⢠MapInfo Professional âalwaysâ reads directly from the database
⢠Every draw, browse, select click which can negatively affect
performance.
⢠Data is reread from the server on every access
52. Every connection is a new opportunityâ˘
Live with Cache
⢠Uses a temporary cache
ď§ Since 9.5.1
â MapInfo table stored in a temporary MapInfo table.
â The cache is progressive, as you pan, zoom out or have
more than one map window of the same data, the cache
grows
⢠Data is cached as used in the map, so subsequent access to the
same data will be quicker
⢠The cache is cleared when the table closes
53. Every connection is a new opportunityâ˘
Conclusions
Only use LIVE WITHOUT CACHE when
ď§ The data is highly volatile (changing minute to minute or even
sooner)
Use LIVE WITH CACHE when
ď§ The table data is very large and it is not feasible to create a filter
query to download less data
ď§ Your data changes regulary, for instance every day or during the
day
Use LINKED when
ď§ Your data is static or only changes ones a day/week/month/year
ď§ Performance is important
ď§ You want to do advanced spatial analysis on the data in
MapInfo Pro
54. Every connection is a new opportunityâ˘
Conclusions
⢠If you have a small data size in your table, it will probably not matter
if you choose Live or Linked
⢠Using a LIVE table ensures that users log onto the database before
they can access the data
⢠If you use live tables we recommend that you access your data thru
a workspace with zoom levels set on the live table to prevent
downloading unnecessary data
⢠The support for MARS has improved the use of live with cache
57. Every connection is a new opportunityâ˘
When is the query performed?
For Linked tables query is performed when
ď§ the table is opened the first time
ď§ the table is refreshed.
For Live with cache tables query is performed when
ď§ the table is added to a map
ď§ you zoom or pan in the map
For Live without cache query is performed when
ď§ the table is added to a map
ď§ you zoom or pan in the map
ď§ you refresh the map
ď§ âŚ
58. Every connection is a new opportunityâ˘
Row filtering
You can specify which records to retrieve from the database by attributes
And by geography
Value of Current_Mapper and Selection are static and not updated when the
table is refreshed.
âSelectionâ only available when a selection
is active
âCurrent_Mapperâ only available when a
map is active
âObjectâ is only available for mappable
tables
âLikeâ and ânot likeâ only available for text
columns
Do not use ââ around text values!
59. Every connection is a new opportunityâ˘
Querying - Expert
Write your own SQL statement
Syntax depends on the SQL dialect of the database
MapInfo Professional will âtranslateâ certain expression when passing
the query to the database:
ď§ Object
ď§ Within
ď§ Selection
ď§ Current_Mapper
ď§ âŚ
You can save and open queries using the two buttons on the right side
of the dialog
60. Every connection is a new opportunityâ˘
Metadata of a spatial query
!table
!version 650
!charset WindowsLatin1
Definition Table
Type LINKED Charset "WindowsLatin1"
Fields 3
MI_PRINX Integer ReadOnly ;
NAME Char (50) ;
TYPE Char (50) ;
begin_metadata
"IsReadOnly" = "FALSEâ
"DATALINK" = ""
"DATALINKConnectionString" = "DSN=GIS;MARS_Connection=Yes"
"DATALINKQuery" = "select ""MI_PRINX"", ""NAME"", ""TYPE"", ""OBJECT""
from ""GIS"".""dbo"".""POI"" where (OBJECT within Rectangle(
628163.45078508,6112409.85175394,720526.19639343,6186305.28363101))"
"DATALINKSpatialObj" = "ST_Spatial(HG_Box(ST_Point(628163.451003735300,
6186305.285449981700),ST_Point(720526.200186016970,6112409.856650807900)
) ,ST_Point(674344.821471954000,6149357.566051412400))"
end_metadata
62. Every connection is a new opportunityâ˘
Editing
The remote table must contain a primary unique index
ď§ In a view this column should be named MI_PRINX
You can edit the data with every tool available in MapInfo Professional
When editing coordinates of a XY-coordinate table, the coordinates are
updated in the columns with the X and Y coordinates in the
database table
When changing the style on a table that has âper row styleâ enabled the
new style will be stored in the column holding the style. On other
tables the change of style will be dismissed when you refresh the
table
63. Every connection is a new opportunityâ˘
Editing â by multiple users
If multiple users are editing the same table in SQL Server,
they must not access this database table thru the same
physical file on disk.
If they do only one user will be able to edit the table at a
time â the others will be prevented from editing as soon
as the first users starts editing.
They must access the database table thru their own (local)
copy of a MapInfo table, can be linked as well as live
64. Every connection is a new opportunityâ˘
Saving
Click Save Table to save the pending edits to the DBMS table
When saving the edits to the database, MapInfo checks if the records
you have changed, have been changed in the database since you
accessed these. If so, a dialog appears asking you to solve the
conflict
If you are using a linked table, MI Pro will ask if you want to refresh the
table as well. I would recommend that you say yes
Saving changes offline (only for Linked tables) can be done by closing
the table. MapInfo will ask how to store the pending edits:
ďž Save Changes to MapInfo Table
ď§ Save Changed to Server
ď§ Discard Changes
66. Every connection is a new opportunityâ˘
Conflict resolution in MapInfo Pro
If a table has been changed in the database when being saved,
MapInfo will prompt the user with a Conflict Resolution dialog like
this one
Here you can see what has been changed.
You can see the original server version, the current MapInfo version
and the current server version
You can decide what to keep and what to change â column by column
⢠Here you can see that column KATEGORI has
been changed, and how.
⢠You can also see that the geometry (object)
has been changed. Harder to see how that has
changed
69. Every connection is a new opportunityâ˘
Refreshing
Reloading data from the database can be done with Table >
Maintenance > Refresh DBMS Table...
Refreshing a DBMS table
ď§ Checks the database for changes
ď§ Reapplies the query condition. Note that the query conditions
are static.
ď§ If you have specified to filter using the current map or current
selection, this filter will always be applied to the table. To specify
a different map extent, you have to reopen the table from the
database.
MapBasic syntax is: Server Refresh name_of_table
70. Every connection is a new opportunityâ˘
Refreshing DBMS tables thru a
workspace
!Workspace
!Version 950
!Charset WindowsLatin1
Dim nConn As Integer
nConn = Server_Connect( "ODBC", "DSN=GIS;UID=EditUser;PWD=Edit" )
Print âConnection opened as no: " + nConn
Print âNow opening tables..."
Open Table "D:3. demodbmsBuildings.tab" Interactive
Map From Buildings
Print âRefreshing the DBMS tables..."
Server Refresh Buildings
Close Table Buildings
Print âWe are done!"
Server nConn Disconnect
Undim nConn
72. Every connection is a new opportunityâ˘
Files versus database
The are a number of differences between MapInfoâs flat tab files and
keeping the data in SQL Server
ď§ Several applications can access the data, not only MapInfo
software
ď§ Multiple user editing
ď§ The entire database stuff: relations, views, security, triggers etc.
When data is kept in the flat MapInfo tab files, the application needs to
handle things like
ď§ timestamp on change
ď§ keeping historic versions
ď§ etc.
When the data is in the database, the database can manage these
things.
74. Every connection is a new opportunityâ˘
Inner Join
ID NAME LASTNAME
1 Peter 1
2 Paul 3
3 Mary 5
4 Ann 2
ID LASTNAME
1 Møller
2 Smith
3 McCartney
4 Probert
ID NAME LASTNAME
1 Peter Møller
2 Paul McCartney
4 Ann Smith
SELECT P.ID, P.NAME, L.LASTNAME
FROM dbo.PERSONS AS P
INNER JOIN dbo.LASTNAMES AS L
ON (P.LASTNAME = L.ID)
75. Every connection is a new opportunityâ˘
Left Outer Join
ID NAME LASTNAME
1 Peter 1
2 Paul 3
3 Mary 5
4 Ann 2
ID LASTNAME
1 Møller
2 Smith
3 McCartney
4 Probert
ID NAME LASTNAME
1 Peter Møller
2 Paul McCartney
3 Mary <NULL>
4 Ann Smith
SELECT P.ID, P.NAME, L.LASTNAME
FROM dbo.PERSONS AS P
LEFT OUTER JOIN dbo.LASTNAMES AS L
ON (P.LASTNAME = L.ID)
76. Every connection is a new opportunityâ˘
Cross Join
ID NAME LASTNAME
1 Peter 1
2 Paul 3
3 Mary 5
4 Ann 2
ID LASTNAME
1 Møller
2 Smith
3 McCartney
4 Probert
ID NAME LASTNAME
1 Peter Møller
2 Paul McCartney
4 Ann Smith
SELECT P.ID, P.NAME, L.LASTNAME
FROM dbo.PERSONS AS P
CROSS JOIN dbo.LASTNAMES AS L
WHERE (P.LASTNAME = L.ID)
Note: A Cross Join without condition will join every
record in the first table with every record in the
other table
77. Every connection is a new opportunityâ˘
Some (spatial) join types of SQL Server
Inner Join
SELECT R.*, P.PLACENAME
FROM dbo.ROADS AS R INNER JOIN dbo.PLACES AS P
ON (R.SP_GEOMETRY.STIntersects(P.SP_GEOMETRY) = 1)
Left Outer Join
SELECT R.*, P.PLACENAME
FROM dbo.ROADS AS R LEFT OUTER JOIN dbo.PLACES AS P
ON (R.SP_GEOMETRY.STIntersects(P.SP_GEOMETRY) = 1)
Cross Join
SELECT R.*, P.PLACENAME
FROM dbo.ROADS AS R CROSS JOIN dbo.PLACES AS P
WHERE (R.SP_GEOMETRY.STIntersects(P.SP_GEOMETRY) = 1)
80. Every connection is a new opportunityâ˘
Geometry vs Geography
The geometry data type supports planar, or Euclidean (flat-earth),
data. The geometry data type conforms to the Open Geospatial
Consortium (OGC) Simple Features for SQL Specification version
1.1.0.
In addition, SQL Server supports the geography data type, which
stores ellipsoidal (round-earth) data, such as GPS latitude and
longitude coordinates.
Read more:
⢠http://msdn.microsoft.com/en-us/library/bb964711.aspx
Point
Line/Pline
Region
Region
Pline
Multi
Point
Collection
82. Every connection is a new opportunityâ˘
Invalid geometries
Find records with invalid geometries
Select * From dbo.MYTABLE
Where SP_Geometri.STIsValid() = 0
Fix records with invalide geometries
â pure magic!? Or not!?
Update dbo.MYTABLE
Set SP_Geometri = SP_Geometri.MakeValid()
83. Every connection is a new opportunityâ˘
Coordinate systems â EPSG codes
Querying EPSG codes for a table, ogsĂĽ known as SRID:
select distinct SP_GEOMETRY.STSrid from dbo.MYTABLE
If it isnât ârightâ, you can change it using this statement:
Update dbo.MYTABLE Set SP_GEOMETRY.STSrid = 25832
But do not change the EPSG code to one of a completely different coordinate system.
But there does exist coordinate systems with different EPSG codes!:
"UTM Zone 32 Euref89p25832â
, 8, 115, 7, 9.0, 0, 0.9996, 500000, 0
"ETRS TM Zone 32, Northern Hemisphere (ETRS89)p3044â
, 8, 115, 7, 9, 0, 0.9996, 500000, 0
Note that EasyLoader has its own projection file!!
84. Every connection is a new opportunityâ˘
Spatial SQL samples
Adding a column with the area
Select *, SP_GEOMETRY.STArea() As Area
From dbo.PLACES
Adding a column with the length
Select *, SP_GEOMETRY.STLength() As Length
From dbo.ROADS
85. Every connection is a new opportunityâ˘
Spatial SQL samples
Finding municipalities and their neighbours
Select t1.NAME, t2.NAME
From dbo.MUNICIPALITIES t1, dbo.MUNICIPALITIES t2
Where (t1.SP_GEOMETRY.STTouches(t2.SP_GEOMETRY) = 1
Or t1.SP_GEOMETRY.STIntersects(t2.SP_GEOMETRY) = 1)
And t1.MI_PRINX <> t2.MI_PRINX
Order By t1.NAME
86. Every connection is a new opportunityâ˘
Spatial SQL samples
Adding city name to only those roads, that intersects a city
Select R.*, P.PLACENAME
FROM dbo.ROADS AS R
CROSS JOIN dbo.PLACES AS P
WHERE (R.SP_GEOMETRY.STIntersects(P.SP_GEOMETRY) = 1)
Adding city name to the roads, that intersects a city and NULL to the other
roads
Select R.*, P.PLACENAME
FROM dbo.ROADS AS R
LEFT OUTER JOIN dbo.PLACES AS P
On (R.SP_GEOMETRY.STIntersects(P.SP_GEOMETRY) = 1)
89. Every connection is a new opportunityâ˘
What is a view?
Et view can be seen as a way to look at your data
With a view you can
⢠limit the number of columns and/or records you want to see, for
instance to separate a table of roads into different road classes
⢠merge multiple columns to one column, for instance merge road
name and house no to a address column
⢠enrich one table with data from another table, for isntance by
transfering the postal area name from a postal table to a table with
addresses. You often do this by joining these tables. This can be
done thru alphanumerical or spatial attributes
⢠combine multiple tables into one.
90. Every connection is a new opportunityâ˘
Creating views in SQL Server â mappable
If the views must be mappable from
within MapInfo Pro, you need to make
the view mappable
You can also manually add the view to
the MapInfo_MapCatalog â if you
know all the parameters
Or you can copy the record of the base
table in the Map Catalog, insert the
copy and change the name of the
table to the name of the view
93. Every connection is a new opportunityâ˘
Making a DBMS table mappable
This will add a record of that table to the MapInfo
MapCatalog specifying how MapInfo Professional should
show this table in a map
You need to specify where to get the spatial data, what
coordinate system to use and what symbology to apply
to the spatial data when displaying it in MapInfo
Professional
You can do this thru Table > Maintenance > Make DBMS
Table Mappable in MapInfo Professional
or by copying and modifying a record in the MapCatalog
95. Every connection is a new opportunityâ˘
A view that merges tables
The statement below should be run from a Query-vindue â not thru
View > Create New:
Create View dbo.viewAddressesUnion As
SELECT *
FROM dbo.ADDRESSES_A
UNION ALL
SELECT *
FROM dbo.ADDRESSES_B
Add it to the MapCatalog if it is mappable
96. Every connection is a new opportunityâ˘
Improved performance with views
If you create a view that you want to search for specific records, it might
be an idea to index the view
To be able to index your views, you need to bind the views with the
data used in the views, this is called SCHEMABINDING
You also need a unique clustered index. Otherwise you canât index
other columns
Now you can index other columns, for instance the column with your
addresses or the like.
Read more here:
ď§ http://en.wikipedia.org/wiki/Materialized_view
ď§ http://msdn.microsoft.com/en-us/library/dd171921.aspx
ď§ http://www.mssqltips.com/sqlservertip/1610/sql-server-schema-
binding-and-indexed-views/
97. Every connection is a new opportunityâ˘
SCHEMABINDING
Right click on your view and select Scritp View As > Alter To > New
Query Window
Add âWITH SCHEMABINDINGâ as shown below
Hit F5 or click the Execute button to modify the view
Or set it while creating the view
98. Every connection is a new opportunityâ˘
Unique Clustered Index
Right click on the Index folder of your view and select Create New....
Write a name, like âPK_â + the name of your view
Pick the primary key column using the Add button
Choose Clustered and check Unique
Hit OK
101. Every connection is a new opportunityâ˘
What are Triggers?
A trigger can be called when something happens in the
database
It can be called when records are inserted, updated,
deleted
It can be called when a user logs onto the database
A trigger can be used to stamp records with information on
who changed them and when
A trigger can be used to copy changed records to a historic
table
102. Every connection is a new opportunityâ˘
Temporary tables in triggers
SQL Server has two temporary tables, that can be accessed in a trigger:
inserted
ď§ Contains the new records, that are to be inserted. This table
contains the changed records as they look after the change
ď§ Exists on insert and on update
deleted
ď§ Contains the records that have been deleted or updated. This table
contains the records as they look before they are changed/deleted
ď§ Exists on update and on delete
103. Every connection is a new opportunityâ˘
Trigger statement
CREATE TRIGGER [schema_name.] trigger_name
ON { table | view }
[ WITH <dml_trigger_option> [ ,...n ] ]
{ FOR | AFTER | INSTEAD OF } { [INSERT] [,] [UPDATE] [,] [DELETE]}
[ NOT FOR REPLICATION ]
AS { sql_statement [ ; ]
[ ,...n ]
| EXTERNAL NAME <method specifier [ ; ] > }
104. Every connection is a new opportunityâ˘
Create a timestamp trigger on update
CREATE TRIGGER dbo.trg_MY_TABLE_AfterUpdate
ON dbo. MY_TABLE
AFTER UPDATE
AS
Begin
Update dbo.MY_TABLE
Set DATE_CHANGED = CURRENT_TIMESTAMP,
USER_CHANGED = USER
Where MI_PRINX In (Select MI_PRINX From inserted);
End
GO
105. Every connection is a new opportunityâ˘
Create a timestamp trigger after insert
CREATE TRIGGER dbo.trg_MY_TABLE_AfterInsert
ON dbo. MY_TABLE
AFTER INSERT
AS
Begin
Update dbo.MY_TABLE
Set DATE_CREATED = CURRENT_TIMESTAMP,
USER_CREATED = USER
Where MI_PRINX In (Select MI_PRINX From inserted);
End
GO
106. Every connection is a new opportunityâ˘
Create a âhistoryâ trigger
CREATE TRIGGER dbo.trgCopyToHistory
ON dbo.ADM_KOMMUNE_2007
AFTER DELETE,UPDATE
AS
Begin
Insert Into dbo.ADM_KOMMUNE_2007_history
(OBJECTID, NAME, OBJECTTYPE, ADM_CODE
, MI_PRINX_ORIGINAL, SP_GEOMETRY, MI_STYLE)
Select OBJECTID, NAME, OBJECTTYPE, ADM_CODE
, MI_PRINX, SP_GEOMETRY, MI_STYLE
From deleted
End
Go
107. Every connection is a new opportunityâ˘
Trigger updating X and Y columns
Create TRIGGER [dbo].[trg_MYTABLE_AfterUpdate]
ON [dbo].[MYTABLE]
AFTER INSERT, UPDATE
AS
BEGIN
UPDATE DBO.MYTABLE
SET X = SP_GEOMETRY.STX,
Y = SP_GEOMETRY.STY
WHERE MI_PRINX IN (SELECT MI_PRINX FROM inserted)
END
109. Every connection is a new opportunityâ˘
Using MapBasic to access SQL Server
110. Every connection is a new opportunityâ˘
Process
Create connection
nConn = Server_Connect("ODBCâ, "DSN=GIS")
Do something
Server Create Map
Server Create Style
Server Create Table
Server Link Table
Register Table
Server Refresh
Server Set Map
Server_Execute
Commit Table
âŚ
Close Connection
Server nConn Disconnect
111. Every connection is a new opportunityâ˘
Server_Execute
You can use the Server_Execute function to send SQL statements to
the SQL Server to be executed
Make sure that you have an connection to the database open
Print Server_Execute(1, âDrop table dbo.PLACESâ)
Print Server_Execute(1, âDelete From
MapInfo.MapInfo_MapCatalog
Where OWNERNAME = âdboâ
and TABLENAME = âPLACESââ)
Do remember to replace the â and â in the MapBasic window when
copied from a PowerPoint
112. Every connection is a new opportunityâ˘
MapBasic applications - FindDBMS
Find DBMS is a small utility showing how a search can be done using a
spatial database on the back end
The tool searches a predefined table in the database using the
connection #1. This could be changed to be a specific data source.
The tool lets you enter some value to search for. When you hit Enter,
the SQL Select is sent to the database and the matching values are
returned and shown in a listbox.
When you click on any of the returned values, the matching record is
highlighted in the map and the map is zoomed to the record
Note that you should have the table searched open in a map. The
name of this table is specified in the config file: FIND DBMS.ini
115. Every connection is a new opportunityâ˘
MapBasic applications - TableRefresh
TableRefresh is a small utility that will search a file structure for tables
The tables found will be opened and if they are either a Linked or a
WFS table, the application can refresh them if this has been
specified
The tool is controlled by the configuration file
117. Every connection is a new opportunityâ˘
Partner offerings
A number of our partners has seen a need for helping
customers take advantage of spatial databases
This has resulted in a number of applications for this area.
Here are two examples, but there are more out there
120. Every connection is a new opportunityâ˘
Final Words
We have now looked at how to
⢠prepare a database to be used by MapInfo Professional
⢠access a spatial database from MapInfo Professional
⢠upload data to the spatial database using EasyLoader
⢠open tables from a spatial database from MapInfo
Professional
⢠create views in a spatial database
⢠implement some triggers in the spatial database
⢠take advantage of the spatial database from MapBasic
121. Every connection is a new opportunityâ˘
Questions
ď§ Peter Horsbøll Møller
ď§ peter.moller@pb.com
ď§ www.mapinfo.com
122. Every connection is a new opportunityâ˘
Every connection is a new opportunity
â˘