MapInfo Professional 11.0 Hvordan man tilgår en...
Transcript of MapInfo Professional 11.0 Hvordan man tilgår en...
MapInfo Professional 11.0
Hvordan man tilgår en database
Peter Horsbøll Møller, Senior Systems Engineer
Marts 2012
Opsætning af en spatial database så den
kan anvendes fra MapInfo Professional
11.0
Anvende en spatial database fra MapInfo Professional 11.0
Kunne være enhver spatial database
Kunne være MI Pro 10.0, 10.5 eller 11.0
Oprette en ODBC-datakilde
Data
Data
Oprette en datakilde til SQL Server 2008
• Åbn Select Data Source. Kan tilgås fra
Åbn dialogboksen eller via Filer > Åbn
DBMS-tilslutning.
• Vælg datakildetype
– Filbaseret datakilde
– Maskindatakilde
• Klik på knappen Ny.../New…
• Vælg Bruger- eller Systemdatakilde
• Vælg drivertype/databasetype:
– SQL Server Native Client 10.0
• Datakilden bliver nu oprettet
Konfiguration af SQL Server 2008 datakilde
• Indtast navn, beskrivelse og server
• Vælg logintype (ofte Windows
Authentication) og indtast brugernavn
og kodeord, hvis du valgte SQL Server
Authentication
• Angiv standard database – altid!
• Brug ”ANSI Quoted Identifiers”
• Afprøv datakilden
MapInfo’s kortkatalog: MapInfo_MapCatalog
Kortkataloget
• Kortkataloget (MapInfo.MapInfo_MapCatalog) beskriver geografiske
tabeller i en database med værdier som:
– Type af spatial tabel, for eksempel XY, SpatialWare, Oracle, SQL
Server, PostgreSQL/PostGIS, mm.
– Koordinatsystem
– Dataafgrænsninger
– Symbol, standard og rækkevis
– Standardvisning
• Kortkatalog skal findes én gang i en
database med geografiske data, som
skal tilgås fra MapInfo Professional
Oprette kortkataloget – EasyLoader
• Start EasyLoader fra Værktøjsstyringen
• Kør EasyLoader fra Værktøjsmenuen
• Åbn en tilslutning til databasen via ODBC-
knappen. Du skal have DBA-rettigheder
• Tryk på Kortkatalog-knappen for at
oprette kortkataloget
• Du skulle nu gerne få at vide at
kortkataloget er blevet oprettet
• Hvis kortkataloget allerede findes, vil du
se en liste med tabeller allerede
registreret i kortkataloget. Du vil kunne
fjerne en eller flere af disse, hvis du
ønsker det
Åbne DBMS-tabeller i MapInfo Professional
Åbne en DBMS-tabel
• Vælg Filer > Åbn
• Tryk på Åbn DBMS-tilslutning
eller vælg den allerede åbne
tilslutning i listen med Filtyper
• Vælg den ønskede tabel og tryk
på Åbn.
Åbne en DBMS-tabel
• Specificer:
– Kolonner
– Rækker
– Adgangstype
• Sammenkædet
• Direkte med Cache
• Direkte uden Cache
– Hvor tab-filen skal gemmes
på disken
Forespørgsler – Rækkefiltrering
• Du kan angive hvilke poster, du ønsker at hente fra databasen
• Ved hjælp af attributter
• Ved hjælp af geografi
• Værdien af Current_Mapper og Selection er statiske og opdateres ikke
med nye værdier, når tabellen opdateres.
“Selection” er kun tilgængelig hvis der er
en aktiv udvælgelse
“Current_Mapper” er kun tilgængelig hvis
der er et kort aktivt
“Object” er kun tilgængelig for
kortlægningsklare tabeller
“Like” og “not like” er kun tilgængelige for
tekst-kolonner
Brug ikke ”” omkring tekstværdien!
Forespørgsler - Ekspert
• Skriv dine egne SQL-udtryk
• Syntaksen afhænger af SQL dialekten i databasen
• MapInfo Professional vil “oversætte” nogle specifikke udtryk når
forespørgslen sendes til databasen:
– Object
– Within
– Selection
– Current_Mapper
– …
• Du kan gemme og indlæse forespørgsler via de to knapper på højre
side i dialogboksen
• Det er kun første gang at du åbner en DBMS-tabel at du skal angive
hvilke data du ønsker at åbne
• Efterfølgende kan du genåbne disse data ved at åbne tab-filen
• Tab- filen indeholder all nødvendig information
– Tabelstruktur
– tilslutningsinformation
– Kan også indeholde brugernavn og kodeord
• Hvis tabellen blev oprettet som “sammenkædet”, bør du overveje at
opdatere tabellen.
• Hvis tabellen blev oprettet som ”direkte”, vil MapInfo Professional læse
de nyeste data fra databasen
Genåbne en DBMS-tabel
Sammenkædet kontra Direkte
Sammenkædet kontra Direkte - Sammenkædet
• Sammenkædet
– Data bliver kopieret til MapInfo tabellen, når tabellen oprettes og når
den opdateres
– Adgang til databasen er kun nødvendig, når du gemmer eller
opdaterer tabellen
-> At arbejde uden tilslutning og lange transaktioner er understøttet
– Hastigheden er lige så god som en normal MapInfo tabel, når først
data er hentet
– Data kan tilgås skrivebeskyttet hvis der ikke findes en primær nøgle
– Hvis du bruger en forespørgsel til kun at hente de nødvendige data,
vil forbedre hastigheden ved download. Forespørgslen kan skabes
via Rækkefilter, kolonnefilte rog Ekspert dialogboksene
– Data hentes ned til samme placering som tab-filen
– Duplikerede data
Sammenkædet kontra Direkte - Direkte
• Direkte med og uden cache
– Åbning er tabellerne første gang kan være hurtigere end
sammenkædet – afhængig af zoomniveaue i kortvinduet
– En “vis hele lager” eller zoom ud til hele visningen vil hente alle
poster fra tabellen
– Data skal have en primær nøgle
– Du skal altid have en åben tilslutning til databasen
Sammenkædet kontra Direkte - Direkte uden cache
• Direkte uden cache
– MapInfo Professional læser “altid” direkte fra databasen
– Ethvert optegning, gennemse eller udvælgelse kan have en negativ
effekt på performance
– Data genlæses fra database-serveren ved et hvert opslag
Sammenkædet kontra Direkte – Direkte med cache
• Direkte med cache
– Anvender en midlertidig cache
• MapInfo tabel gemt i Windows temp mappen
• Cachen er progressiv, data bevares i cachen i den aktuelle
session og cachen vokser løbende
– Data gemmes i cachen efterhånden som data indlæses fra
databasen. Dermed vil efterfølgende adgang til de samme data blive
hurtigere
– Cachen nulstilles, når tabellen lukkes og når tabellen opdateres
Sammenkædet kontra Direkte – Konklusioner?
• Brug kun “direkte uden cache” når
– Data ændres hvert minut eller hurtigere
• Brug ”direkte med cache” når
– Tabellen er meget stor og du ikke kan filtrere via en forspørgsel
– Dine data ændres løbende, f.eks. dagligt
• Bruge sammenkædet når
– Dine data er statiske og kun ændres en gang hver uge/måned/år
– Performance er vigtig
– Du skal laver større analyser på dine data, f.eks. SQL-forespørgsler
Sammenkædet kontra Direkte – Konklusioner?
• Hvis du har en meget lille datamængde i din tabel, spiller det næppe
den store roller om du anvender direkte eller sammenkædet
• Med ”direkte” tabeller sikrer du dig at brugerne ”logger på” for at tilgå
data.
• Hvis du anvender ”direkte” tabeller, anbefaler vi at du tilgår dine tabeller
via et arbejdsområde med zoomniveauer, som forhindrer at unødvendig
data hentes
• Understøttelse af MARS har forbedret anvendelse af Direkte med
Cache
Redigere i tabeller fra SQL Server
Redigere
• Tabellen i databasen skal have en primær indeks kolonne
– I et view skal denne kolonne hedde MI_PRINX
• Du kan redigere data med et hvert værktøj i MapInfo Professional
• Hvis du ændrer stilen på en tabel, med rækkevis stil aktiveret, gemmes
stilen i kolonnen med stile, ofte navngivet ”MI_STYLE”. På andre
tabellen vil ændringer af stilen ikke blive fastholdt, når du opdaterer
tabellen
Redigering – af flere samtidige brugere
• Hvis flere brugere skal redigere den samme tabel i SQL Server, skal de
ikke tilgå denne tabel via den samme fysiske fil på harddisken.
• Hvis de gør dette, vil kun en bruger kunne redigere tabellen ad gangen
– de øvrige brugere vil blive forhindret i at redigere, så snart den første
brugere begynder at redigere.
• De skal altså tilgå databasen via hver deres lokale kopi af en MapInfo
tabel. Den kan være såvel sammenkædet som direkte
Gemme
• Tryk på Gem tabel for at gemme ikke gemte ændringer i en
DBMS tabel
• Når ændringer gemmes til databasen, undersøger MapInfo om
posten der er blevet ændret, er blevet ændret i databasen efter
den blev læst derfra. Hvis det er tilfældet bliver du præsenteret
for en dialog, hvor du skal løse denne konflikt
• Gemme ændringer lokalt i (kun for sammenkædede tabeller)
kan gøres ved blot at lukke tabellen. MapInfo vil så spørge dig
hvad der skal ske med de ikke-gemte ændringer:
Gem ændringer i MapInfo-Tabel
– Gem ændringer på server
– Fortryd ændringer
Løs konflikter i MapInfo Pro
• Hvis en tabel er blevet ændret i databasen, når du gemmer ændringer vil MapInfo præsenterer brugeren for en Løs konflikt dialogboks som vist
• Du kan her se hvilke data/kolonner, der er blevet ændret
• Du kan se den originale database version, den aktuelle MapInfo version og den aktuelle database version
• Du kan vælge hvad der skal beholdes og hvad der skal ændres – kolonnevis
• Du kan her se at kolonnen
PANDSTATUS er ændret og til hvad.
• Du kan også se at geografien (object)
er blevet ændret. Det er dog svært at
se på hvilken måde den er ændret
Opdatere sammenkædede tabeller
Opdatere
• Genindlæse data fra databasen kan gøres via Tabel > Juster > Opdater
DBMS-Tabel...
• Opdatere en DBMS-tabel
– Anvender forespørgslen. Bemærk at disse betingelser er statiske.
– Hvis du har angivet en forespørgsel med brug af aktuelt kort eller
aktuel udvælgelse, vil den originale værdi igen blive anvendt. For at
at angive en ny værdi, f.eks. Et nyt kortudsnit, er du nødt til at
genåbne tabellen fra databasen og her angive den nye betingelse.
• MapBasic syntaks: Server Refresh name_of_table
Opdatere DBMS-tabeller via et arbejdsområde
!Workspace
!Version 950
!Charset WindowsLatin1
Dim nConn As Integer
nConn = Server_Connect( "ODBC", "DSN=GIS;UID=EditUser;PWD=Edit" )
Print "Åbnet tilslutning som nr: " + nConn
Print "Åbner nu tabellerne..."
Open Table "D:\3. demo\dbms\Byflade.tab" Interactive
Map From Byflade
Print "Opdaterer nu DBMS-tabellerne..."
Server Refresh Byflade
Close Table Byflade
Print "Så er vi færdige"
Server nConn Disconnect
Undim nConn
MapInfo tabeller kontra tabeller i SQL Server
MapInfo tables versus tables in SQL Server
• Der er en række forskelle mellem MapInfos flade filer og opbevaring af
data i SQL Server
– Flere programmer kan tilgå data, ikke kun MapInfo software
– Flerbruger editering
– Alle fordelene ved relationelle databaser: relationer, views,
sikkerhed, triggers mm.
• Når data opbevares i MapInfos flade filer, skal en applikation håndtere
elementer som
– Tidsstempling ved ændring af data
– Holde styr på historiske versioner af data
– mm.
• Når data opbevares i databasen, kan databasen varetage disse ting for
alle programmer, der måtte tilgå data.
Oprette views i SQL Server
Hvad er et view?
• Et view kan betragtes som en måde at se på data
• Med et view kan man begrænse antallet af kolonner eller/og antallet af
poster, man ser.
• Med et view kan man også sammenstille flere kolonner til én kolonne.
F.eks. kan man sammensætte VEJNAVN, HUSNR og
HUSNR_BOGSTAV til en ADRESSE-kolonne
• Man kan også bruge views til at berige et tabel med data fra en anden
tabel, f.eks. overføre vejnavnet fra en vejnavnetabel til en tabel med
adresser. Dette gøres ofte via et join, en sammenkædning, af tabeller.
Du kan gøre dette enten på alfanmeriske eller geogratisk attributter.
• Et view kan også sammensætte flere tabeller til en
Et view der sammensætter tabeller
Nedenstående skal køres fra et Query-vindue – ikke som et view: Create View [dbo].[viewSearch] WITH SCHEMABINDING As
Select VEJNAVN
+ ' ' + Cast(HUS_NR as VarChar) + HUSBOGSTAV
+ ', ' + Cast(POSTNR As VarChar)
+ ' ' + POSTDIST As SEARCHVALUE, MI_PRINX, SP_GEOMETRY
From dbo.ADRESSER
Union All
Select MAS_MATRNR + ' ' + ELAVNAVN As SEARCHVALUE
, (1000000 + MI_PRINX)
As MI_PRINX
, SP_GEOMETRY
From dbo.JORDSTYKKER
• Og tilføj den så til MapCatalog
Spatial SQL eksempler
Tilføj et bynavn til netop de veje, der skærer en by
Select V.*, B.BYNAVN
FROM dbo.VEJMIDTER AS V
CROSS JOIN dbo.BYFLADE AS B
WHERE (V.SP_GEOMETRY.STIntersects(B.SP_GEOMETRY) = 1)
Tilføj et bynavn til de veje som skærer en by og NULL til de øvrige veje
Select V.*, B.BYNAVN
FROM dbo.VEJMIDTER AS V
LEFT OUTER JOIN dbo.BYFLADE AS B
On (V.SP_GEOMETRY.STIntersects(B.SP_GEOMETRY) = 1)
Triggers i SQL Server
Hvad er Triggers?
• En trigger kan blive kaldt når der sker noget specielt i databasen
• De kan f.eks. kaldes når poster indsættes, opdateres eller slettes
• De kan også blive kaldt når en bruger logger på databasen
Opret en tidsstemplende trigger ved opdatering
CREATE TRIGGER dbo.trg_MY_TABLE_OnUpdate
ON dbo.MY_TABLE
AFTER UPDATE
AS
Begin
Update dbo.MY_TABLE
Set DATE_CHANGED = CURRENT_TIMESTAMP,
USER_CHANGED = SYSTEM_USER
Where MI_PRINX In (Select MI_PRINX From inserted);
End
GO
Opret en tidsstemplende trigger ved indsættelse
CREATE TRIGGER dbo.trg_MY_TABLE_OnInsert
ON dbo. MY_TABLE
AFTER INSERT
AS
Begin
Update dbo.MY_TABLE
Set DATE_CREATED = CURRENT_TIMESTAMP,
USER_CREATED = SYSTEM_USER
Where MI_PRINX In (Select MI_PRINX From inserted);
End
GO
Tilgå SQL Server via MapBasic
Process
• Opret tilslutning
nConn = Server_Connect("ODBC", "DSN=GIS;UID=EditUser;PWD=Edit")
• Gør ”noget” Server Create Map
Server Create Style
Server Create Table
Server Link Table
Register Table
Server Refresh
Server Set Map
Server_Execute
Commit Table
…
• Luk tilslutning Server nConn Disconnect
Server_Execute
• Du kan bruge Server_Execute funktionen til at sende SQL kommandoer
til udførsel i databasen
• Sikre dig at du har en tilslutning åben, her bruges tilslutning nr 1
Print Server_Execute(1, ”Drop table dbo.KOMMUNE”)
Print Server_Execute(1, ”Delete From MapInfo.MapInfo_MapCatalog
Where OWNERNAME = ’dbo’
and TABLENAME = ’KOMMUNE’”)
• OBS: Ovenstående skal stå på én linje pr. kommando
• Husk at erstatte ” og ’ i MapBasic –vinduet, hvís du kopieret
ovenstående fra en PowerPoint
Spørgsmål ?
The Power of Insight
MapInfo Professional
Peter Horsbøll Møller, Senior Systems Engineer