Saturday, January 29, 2011

Demo på G: ArcGIS for WP7

Håller på och bygger en liten Demo inför en presentation som vi ska hålla nästa vecka... En kort preview:

Huvudfönstret:
Först bygger man en prototyp i (Microsoft Expression Blend) SketchFlow.


Skapa nytt objekt:


Sen "the real deal" mha ArcGIS for WP7:

Sunday, January 16, 2011

error : Whitespace is not allowed after end of Markup Extension.

Ibland får man knepiga fel som man inte direkt förstår vad dom beror på. Sitter och går igenom Hands On Labbarna för Windows Phone 7. Fick felet "error : Whitespace is not allowed after end of Markup Extension." när jag byggde projektet efter att ha suttit och matade in lite XAML kod i VS2010. Hittade felet till sist det beror på att man råkat slå in ett mellanslag i ett attribut:

 <StackPanel Orientation="Vertical" Width="{Binding Width, ElementName=View} ">  

Skall vara:

 <StackPanel Orientation="Vertical" Width="{Binding Width, ElementName=View}">  

Wednesday, January 12, 2011

Error: Name 'InitializeComponent' is not declared.

Satt och labbade lite med Prism och konverterade Hello World exemplet från C# till VB.Net. När jag fick problem med felmeddeladet "Error: Name 'InitializeComponent' is not declared." visade sig ha med Namespace bytet jag gjort i klassen.

Tänkte att det kan vara en idé att berätta att det finns en lösning för det ifall någon annan råkar ut för samma problem någong gång, se isf detta inlägg på Silverlight forumet: http://forums.silverlight.net/forums/p/91690/211761.aspx

Sunday, October 31, 2010

Använda SketchFlow och ArcGIS Silverlight/WPF Web APIs

Jag har kollat på möjligheterna att använda ArcGIS Silverlight/WPF Web APIs i SketchFlow för att göra GIS prototyper. Det känns som att det blir lite mer komplext att bygga en prototyp, men så här kan man iaf göra om man vill.

ESRIs komponenter läggs till i SketchFlow när man installerar API:erna. Vill man lägga till ett bagrundslager så kan man lägga till en karta:


Sen lägga till ett bagrundslager via egenskaper:

Observera att det finns möjlighet att välja flera olika "data källor":

Genom att välja ett tiled layer så går det att koppla upp sig mot bakgrundslager via arcgis.com:


Det går även att lägga till grafiklager och skapa geometrier i detta via AXML editorn:


Som sagt lite mer komplext och knyter sig till ESRIs produkt för Silverlight/WPF för att skapa sin prototyp, vilket kan ha sina för- och nackdelar.

Skapa skissaktiga knappar för SketchFlow

Ej GIS specifikt. Men vill man lyxa till det och lägga in ett verktygsfält med skissliknande knappar, så hittade jag ett tips på StackExchange: Import current UI into sketchflow som mha Paint.Net låter dig skapa skissliknande knappar från t.ex. knapparna som ska användas i rätta projektet.
Detta görs genom att öppna en bild i Paint.Net och använda effekter, Effects | Artistic | pencil Sketch.


Lägg till knappar i SketchFlow och lägg in dina ny skapade bilder som background på knapparna, resultatet blir då så här:

Använda SketchFlow för att skapa GIS prototyper.

Har suttit och klurat lite på hur man skulle kunna använda Microsoft SketchFlow för att skapa GIS prototyper. Det viktigaste i en sådan prototyp är att man måste kunna beskriva när användaren skapar och jobbar med geometrier i kartan. Eftersom detta skiljer sig mot andra typer av applikationer.

För att illustrera geometrier så kan man göra så här
Linjer kan läggas till genom att använda Pen verktyget:

Sen sätter man om den Stroke som används av linjen till Base-Border Sketch:





På samma sätt kan man även göra när det gäller polygoner, men vill man ta en genväg så kan man använda Rectangle Sketch, då slipper man sitta och ändra utseendet på elementen.


För punkter kan man använda Circle sketch.


Genom att förändra border och background går det att skapa en fylld punkt.


Resultatet blir då:

Monday, October 11, 2010

Windows Phone 7 och ArcGIS API for Windows Phone 2.1

Sitter och testar WP7 och ESRIs ArcGIS API for Windows Phone 2.1, en beta för windows phone finns på ESRIs resource sida: http://help.arcgis.com/en/arcgismobile/10.0/apis/windowsphone/ har noterat följande som kan vara värt att veta:

Saturday, September 11, 2010

Balloon Callout i ArcGIS Engine.

Anpassat ett exempel i VBA dokumentationen "How to add balloon callout" så att den fungerar i ArcGIS Engine. Inga stora förändringar krävdes utan det räckte med att byta ut så att ActiveView inte hämtas via MxDocument utan MapControl. Bryter man dessutom ut ActiveView till att vara en inparameter så fungerar dessutom exemplet i både desktop och engine.

 Private Sub AddBalloonCallout(ByVal activeView As IActiveView)  
Dim pTextElement As ITextElement
Dim pElement As IElement
Dim pPoint As IPoint
Dim pCallout As ICallout
Dim pTextSymbol As IFormattedTextSymbol
Dim pGraphicsContainer As IGraphicsContainer
Dim midX As Double, midY As Double
'Create a new text element
pTextElement = New TextElement
pElement = CType(pTextElement, IElement) 'QI
pTextElement.Text = "Text callout" & vbCrLf & "In the middle of the screen"
'Position the new element on the active view's center point
midX = (activeView.Extent.XMax + activeView.Extent.XMin) / 2
midY = (activeView.Extent.YMax + activeView.Extent.YMin) / 2
pPoint = New Point
pPoint.PutCoords(midX, midY)
pElement.Geometry = pPoint
'Set the text element symbology to a default balloon callout
pTextSymbol = New TextSymbol
pCallout = New BalloonCallout
pTextSymbol.Background = CType(pCallout, ITextBackground)
'Use this formula to get a callout anchor point location
pPoint.PutCoords(midX - activeView.Extent.Width / 4, midY + activeView.Extent.Width / 20)
pCallout.AnchorPoint = pPoint
pTextElement.Symbol = pTextSymbol
'Add the element to the active view, either the focus Map or PageLayout
pGraphicsContainer = CType(activeView, IGraphicsContainer)
pGraphicsContainer.AddElement(pElement, 0)
pElement.Activate(activeView.ScreenDisplay)
'Flag the area of the new element for refreshing
activeView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, pElement, Nothing)
End Sub

Friday, September 10, 2010

Skapat en kodsnutt för att fånga när ett lager till i ArcGIS Engine.

Skapat en kodsnutt för att fånga när ett lager läggs till i karta, samt ser till att det lager som ligger överst alltid ligger kvar överst i ArcGIS Engine.


 Private activeViewEvents As ESRI.ArcGIS.Carto.IActiveViewEvents_Event  
Private m_ActiveViewEventsItemAdded As ESRI.ArcGIS.Carto.IActiveViewEvents_ItemAddedEventHandler

Private Sub AddEventListenerToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AddEventListenerToolStripMenuItem.Click
activeViewEvents = CType(axMapControl1.ActiveView.FocusMap, ESRI.ArcGIS.Carto.IActiveViewEvents_Event)

m_ActiveViewEventsItemAdded = New ESRI.ArcGIS.Carto.IActiveViewEvents_ItemAddedEventHandler(AddressOf OnActiveViewEventsItemAdded)

AddHandler CType(axMapControl1.ActiveView.FocusMap, ESRI.ArcGIS.Carto.IActiveViewEvents_Event).ItemAdded, m_ActiveViewEventsItemAdded
End Sub


Private Sub OnActiveViewEventsItemAdded()
'makes layer(1) always on top.
axMapControl1.ActiveView.FocusMap.MoveLayer(axMapControl1.ActiveView.FocusMap.Layer(0), 1)
End Sub

Wednesday, August 25, 2010

Skapat verktyg med IDisplayFeedback.

Vi har problem med standard mätverktyget i ArcGIS engine. Bug in ControlMapMeasureTool? “Measure An Area” creates a duplicate dialog in ArcGIS Engine 10 Så jag har suttit efter tips från Kirk och labbat lite hur man kan skapa egna verktyg med IDisplayFeedback. Hittade ett bra exempel Sample: Custom subtyped command and tool som visade hur man ska göra. Skapar man en ny verktygsklass, så kan man överlagra på det här sättet för att få ett verktyg som mäter areal:

 Private m_polygonFeedback As INewPolygonFeedback  
Private m_screenDisplay As IScreenDisplay

Private m_hookHelper As IHookHelper


Public Overrides Sub OnCreate(ByVal hook As Object)
If (m_hookHelper Is Nothing) Then m_hookHelper = New HookHelperClass

If Not hook Is Nothing Then
m_hookHelper.Hook = hook
End If
End Sub

Public Overrides Sub OnClick()
m_screenDisplay = m_hookHelper.ActiveView.ScreenDisplay
End Sub

Public Overrides Sub OnDblClick()
Dim polygon As IPolygon = m_polygonFeedback.Stop()
MsgBox("Area: " & CType(polygon, IArea).Area)
m_polygonFeedback = Nothing
End Sub

Public Overrides Sub OnMouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Integer, ByVal Y As Integer)
If Button = 1 Then
Dim cursorPoint As ESRI.ArcGIS.Geometry.IPoint = m_screenDisplay.DisplayTransformation.ToMapPoint(X, Y)

If m_polygonFeedback Is Nothing Then
m_polygonFeedback = New NewPolygonFeedbackClass()
m_polygonFeedback.Display = m_screenDisplay

m_polygonFeedback.Start(cursorPoint)
Else
m_polygonFeedback.AddPoint(cursorPoint)
End If

End If
End Sub

Public Overrides Sub OnMouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Integer, ByVal Y As Integer)
If Not m_polygonFeedback Is Nothing Then
Dim cursorPoint As ESRI.ArcGIS.Geometry.IPoint = m_screenDisplay.DisplayTransformation.ToMapPoint(X, Y)
m_polygonFeedback.MoveTo(cursorPoint)
End If
End Sub

Tuesday, July 06, 2010

Långsamma javascript i IE ger felmeddelande.

På vissa sidor så går javascripten så långsamt att man får felmeddelande gång på gång i IE om man vill stoppa skriptet.

Ett skript på den här sidan gör att Internet Explorer går långsamt. Om det fortsätter att vara igång kan datorn sluta att svara. Vill du avbryta skriptet?



Stop running this script


Råkade ut för detta på en sida som visar API dokumentationen har även påtalat felet för dom som står bakom websiten, men det tar ett tag att fixa prestandaproblem och efter att ha stäng felrutan hundra gånger, så googlade jag efter andra alternativ och det finns ett annat sätt att hantera detta genom att ställa upp timeout tiden. Se: http://support.microsoft.com/kb/175500

Thursday, July 01, 2010

Exkludera filer från källkodshantering i Visual Studio.

Är tvungen att kolla upp detta gång på gång, så nu skriver jag upp det i bloggen så kanske jag kommer ihåg det tills nästa gång. Om man vill göra detta i ett vanligt projekt så är det relativt enkelt, gäller bara att komma ihåg att det är under source control i file menyn man ska söka:

1.In Visual Studio, open Solution Explorer and select the file to exclude.

2.On the File menu, click Source Control, then click Exclude from Source Control.

3.When you are ready to place the file under source control, you can access the File menu and click Source Control, then uncheck Exclude from Source Control.

http://msdn.microsoft.com/en-us/library/66tw9ezk(VS.90).aspx

Annat är det med Web sites, här känns det som att källkodshanteringen itne riktigt fungerar på samma sätt, men det går att göra "undo pending changes" på dom filer man inte vill ska läggas till:

Delete files that you want to exclude, add them to were they were again, but do not checkin yet. Then on source control undo pending changes. After that these files would not be source controled items.


http://social.msdn.microsoft.com/Forums/en-US/tfspowertools/thread/f4595ff1-059c-4a33-a3c6-2f22961a73c7

Friday, June 11, 2010

Debugga fel på beroenden mellan olika assemblys.

När man jobbar med stora .Net-projekt eller .Net-projekt som laddar assemblies via t.ex. CAB, så kan det vara svårt att se vad som går fel, när man får ett felmeddelande som säger att följande assenbly inte kan laddas. Hittade en bra beskrivning av ett verktyg som heter fuslogvw.exe Se MSDN: http://msdn.microsoft.com/en-us/library/e74a18c4(VS.71).aspx som man kan använda för att spåra den har typen av fel.

Outlook via HTTP frånkopplad hela tiden i Windows 7.

Har haft problem med att få Outlook att koppla sig till Exchange servern via HTTP enda sen jag installerade om min XP maskin med windows 7. Frågade en kollega och han sa att det var något problem i Vista med RPC och att det var en registernyckel som man skulle ändra. Så jag googlade lite på det och hittade lösningen:
Error messages when you try to connect Outlook 2007 to Exchange Server: "The action cannot be completed" or "Your Microsoft Exchange Server is unavailable" or "Cannot start Microsoft Office Outlook"

Outlook 2007
Click Start, click Run, type regedit in the Open box, and then click OK.
Locate and then click the following subkey:
HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Outlook\RPC
On the Edit menu, point to New, and then click DWORD Value.
Type DefConnectOpts, and then press ENTER.
Right-click DefConnectOpts, and then click Modify.
In the Value data box, type 0, and then click OK.
Exit Registry Editor.
http://support.microsoft.com/kb/913843/en-us

Monday, May 31, 2010

ArcGIS Engine 10.0, platform target x86.

Nytt i ArcGIS 10.0 är att ESRIs assemblies är kompilerade mot x86 plattformen. Detta innebär att alla projekt som refererar ESRIs DLL:er måste sättas till x86. Annars får man ett felmeddelande i stil med:
Could not load file or assembly 'ESRI.ArcGIS.Version, Version=10.0.0.0, Culture=neutral, PublicKeyToken=8fc3cc631e44ad86' or one of its dependencies. Det går inte att hitta filen.

Så vid uppgradering av ArcGIS 9.3 applikationer till 10.0, så får man hålla koll på hur plattformen är satt.


Läs mera här: How to migrate ArcGIS 9.3 Desktop and Engine stand-alone applications to ArcGIS 10, Platform CPU target change

Thursday, May 27, 2010

ArcGIS Engine 10.0, RuntimeManager

Nytt i ArcGIS 10 är att ArcGIS desktop och ArcGIS Engine distribueras till var sin katalogstruktur (What's new for developers at 10), detta för att det oberoende av varandra ska gå att lägga in service packar. Detta innebär också att när man bygger standalone applikationer, så måste man välja vilken runtime man vill köra sin applikation under. När man väljer att skapa en ny MapControl Application project så läggs automatiskt kod in i Program.cs för att hantera detta:

 if  (!RuntimeManager .Bind(ProductCode .Engine))

 {

      if  (!RuntimeManager .Bind(ProductCode .Desktop))

      {

          MessageBox .Show("Unable to bind to ArcGIS runtime. Application will be shut down." );

          return ;

      }

 }

 



Värt att notera det nya RuntimeManager objektet som ESRI använder för att göra bind mot runtime versionen. Detta måste göras i koden innan några ArcObjects objekt anropas.

Run VS as administrator.

När man kör Visual Studio (VS) i Windows 7 (Win7), så är det bra att ställa in så att man kör den som administratör eftersom man i annat fall kan få fel i VS. Detta pga att processen körs med för hög säkerhet. Istället för att varje gång komma ihåg att högerklicka och välja "run as administrator" så kan man välja "egenskaper"


och "Advanced" och klicka i "run as admininstrator"




så startas VS alltid med administrator rättigheter.

Wednesday, May 05, 2010

Slå ihop PDF filer med iTextSharp.

Fick en fråga om jag kunde lägga till en sida med text i en rapport som vi genererar via reporting services. Och visst kan man det men då kommer man bli tvungen att underhålla en sida med text via rapporten vilket inte känns så bra. Ett annat alternativ som kändes mer lockande var att kombinera ihop PDF:en som skapas från reporting services med text sidan som en PDF. Så att dom kan underhållas var för sig.

Testade att skapa en applikation för att slå ihop två PDF:er och använde iText# som vi använder i andra projekt och utnyttjade ett exempel som jag hittade på nätet: http://khsw.blogspot.com/2006/04/merge-pdf-files-using-itextsharp.html gjorde enklast möjliga kod:

Dim destination As String = "c:\\testPDF.pdf"

Dim source As List(Of String) = New List(Of String)

source.Add("c:\\1.pdf")
source.Add("c:\\2.pdf")

PdfMerge.MergeFiles(destination, source.ToArray())

Fungerar hur bra som helst!

Saturday, April 24, 2010

ESRI DevSummit tech sessions. Developing .NET Applications for ArcGIS Engine

Kollat på tech-session-videos som ESRI lagt ut.

I presentationen "Developing .NET Applications for ArcGIS Engine" så går man igenom nyheterna i ArcGIS Engine. Några nyheter är:
  • VS2008, .Net 3.5 SP1.
  • Engine och Desktop är uppdelade som två runtimes.
  • Nytt att man måste aanvända RuntimeManager för att bind mot rätt runtime.
  • Ikonerna skickas med som PNG bilder.
  • GrahicsTracker, ett objekt som hjälper till med realtidsuppdateringar av objekt i kartan.
  • Background GeoProcessing, GeoProcesing kan köras som en separat process.
  • För licenser så har "Concurrent use" och "Borrow/Return" tillkommit.

Saturday, April 17, 2010

Public Resource.resx

Lade till en Resource.resx fil i ett av mina projekt och försökte komma åt ResoureManager objektet från en annat projekt, men fick ett kompileringsfel. :( Det visade sig att VS standardmässigt skapar resursfiler som Internal/Friend isf Public, vilket gör att klasserna bara går att komma åt internt i samma assembly. Detta går att lösa genom att hacka i den automatgenererade koden men det är ajjabajja , det vill man inte göra. Visar sig att det går att byta custom tool som skapar koden, vilket är en bättre lösning:

Byt från ResXCodeFileGenerator till PublicResXFileCodeGenerator så får man en resurs klass som är public.