Sunday, March 27, 2011
QR code generation for geo-location
Have been playing around with http://zxing.appspot.com/generator/ to generate QR code. No problem to scan in and recreate the coordinate in the phone.
Saturday, February 19, 2011
Solved: The incoming message has an unexpected message format 'Raw'.
As I mentioned in my earlier post the ArcGIS Server REST API returned "plain/text" causing the WCF client to give error message: "The incoming message has an unexpected message format 'Raw'. The expected message formats for the operation are 'Xml'; 'Json'. This can be because a WebContentTypeMapper has not been configured on the binding. See the documentation of WebContentTypeMapper for more details." Found a forum post that helped solve the problem:
JSON and WebInvoke The problem can be solved using a WebContentTypeMapper created a class:
And change the app.config:
JSON and WebInvoke The problem can be solved using a WebContentTypeMapper created a class:
public class JsonContentTypeMapper :WebContentTypeMapper
{
public override WebContentFormat
GetMessageFormatForContentType(string contentType)
{
if (contentType == "text/plain; charset=utf-8" )
{
return WebContentFormat .Json;
}
else
{
return WebContentFormat .Default;
}
}
}
And change the app.config:
<?xml version= "1.0 " encoding= "utf-8 " ?>
<configuration>
<system.serviceModel>
<client>
<!--<endpoint address="http://server.arcgisonline.com/ArcGIS/rest/services/Demographics/USA_Median_Household_Income/MapServer/4/query"
binding="webHttpBinding"
bindingConfiguration="ArcGISBinding"
behaviorConfiguration="ArcGIS"
contract="TestRestWCFClient.IArcGISApi"
name="ArcGISREST" />-->
<endpoint address= "http://server.arcgisonline.com/ArcGIS/rest/services/Demographics/USA_Median_Household_Income/MapServer/4/query "
binding= "customBinding "
bindingConfiguration= "ArcGISBinding2 "
behaviorConfiguration= "ArcGIS "
contract= "TestRestWCFClient.IArcGISApi "
name= "ArcGISREST " />
</client>
<bindings>
<webHttpBinding>
<binding name= "ArcGISBinding " maxReceivedMessageSize= "10000000 "/>
</webHttpBinding>
<customBinding>
<binding name= "ArcGISBinding2 ">
<webMessageEncoding webContentTypeMapperType= "TestRestWCFClient.JsonContentTypeMapper, TestRestWCFClient, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null " />
<httpTransport manualAddressing= "true " maxReceivedMessageSize= "10000000 " />
</binding>
</customBinding>
</bindings>
<behaviors>
<endpointBehaviors>
<behavior name= "ArcGIS ">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
Consume ArcGIS Server REST API using WCF.
Have been trying this all day (It does not work), so I write my findings down so it can be continued another day. Found a great blog post here How to consume REST services with WCF that I tried to adapt create a client proxy against ArcGIS Server REST API. The first part creating a Operation contract an adding an endpoint to was easy to do:
The app.config is configured like this:
And the code for running sending a query looks like this:
What's not working? Well seems like the response is "text/plain" (checked with fiddler) instead of "application/json". I haven't found a way to force it to be sent as "application/json". The error I get is: "The incoming message has an unexpected message format 'Raw'. The expected message formats for the operation are 'Xml'; 'Json'. This can be because a WebContentTypeMapper has not been configured on the binding. See the documentation of WebContentTypeMapper for more details."
Update: To make it work read: http://mathiaswestin.blogspot.com/2011/02/solved-incoming-message-has-unexpected.html
[ServiceContract ]
public interface IArcGISApi
{//http://help.arcgis.com/en/arcgisserver/10.0/apis/rest/index.html
//http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StateCityHighway_USA/MapServer/1/query?geometry=-125.4,35.2,-118.7,43.8&geometryType=esriGeometryEnvelope
[OperationContract ]
[WebGet (
BodyStyle = WebMessageBodyStyle .Bare,
ResponseFormat = WebMessageFormat .Json,
UriTemplate = "?f=json&Where={query}&returnGeometry=true&returnIdsOnly=false&outFields=*" )]
//UriTemplate = "?method=flickr.interestingness.getList&api_key={apiKey}&extras={extras}")]
QueryResponse Query(string query);
}The app.config is configured like this:
<?xml version= "1.0 " encoding= "utf-8 " ?>
<configuration>
<system.serviceModel>
<client>
<endpoint address= "http://server.arcgisonline.com/ArcGIS/rest/services/Demographics/USA_Median_Household_Income/MapServer/4/query "
binding= "webHttpBinding "
bindingConfiguration= "ArcGISBinding "
behaviorConfiguration= "ArcGIS "
contract= "TestRestWCFClient.IArcGISApi "
name= "ArcGISREST " />
</client>
<bindings>
<webHttpBinding>
<binding name= "ArcGISBinding " maxReceivedMessageSize= "10000000 "/>
</webHttpBinding>
</bindings>
<behaviors>
<endpointBehaviors>
<behavior name= "ArcGIS ">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
And the code for running sending a query looks like this:
ChannelFactory <IArcGISApi > factory = new ChannelFactory <IArcGISApi >("ArcGISREST" );
var proxy = factory.CreateChannel();
var response = proxy.Query(" );
((IDisposable )proxy).Dispose();
What's not working? Well seems like the response is "text/plain" (checked with fiddler) instead of "application/json". I haven't found a way to force it to be sent as "application/json". The error I get is: "The incoming message has an unexpected message format 'Raw'. The expected message formats for the operation are 'Xml'; 'Json'. This can be because a WebContentTypeMapper has not been configured on the binding. See the documentation of WebContentTypeMapper for more details."
Update: To make it work read: http://mathiaswestin.blogspot.com/2011/02/solved-incoming-message-has-unexpected.html
Saturday, February 12, 2011
Zoom in to feature in ArcGIS Engine using ArcGIS Server and IFind
The second blog post on how to use ArcGIS Server from ArcGIS Engine. This post show how to zoom in on a feature using a IFind searching for a specific value on an attribute.
Basic steps include getting the layer from the map and casting the layer to the IFind interface and searching the layer for the feature. The project are expecting that the layer href="http://server.arcgisonline.com/ArcGIS/rest/services/Demographics/USA_Median_Household_Income/MapServer is loaded in the map.
The code for getting the layer from the map.
The code that does the actual IFind. We cast the layer to IFind and use the Find method on the interface. Important to note is that it only work when you search for a value on an attribute, you can't do a custom query on serveral attributes.
The same result as I got in the previous blog post, load the layer showing whole US:

And after running the find tool it shows Alaska:
Basic steps include getting the layer from the map and casting the layer to the IFind interface and searching the layer for the feature. The project are expecting that the layer href="http://server.arcgisonline.com/ArcGIS/rest/services/Demographics/USA_Median_Household_Income/MapServer is loaded in the map.
Private Sub FindUsingIFindToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FindUsingIFindToolStripMenuItem.Click
OnFind()
End Sub
Private Sub OnFind()
Dim state As String = "Alaska"
Dim attribute As String = "Name"
Dim layername As String = "States"
Dim control As AxMapControl = axMapControl1
Dim layer As ILayer = getLayer(layername)
Dim stateGeometry As IGeometry = Me.Find(layer, attribute, state, control.ActiveView)
control.ActiveView.Extent = stateGeometry.Envelope
control.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewAll, Nothing, Nothing)
End Sub
The code for getting the layer from the map.
Private Function getLayer(ByVal name As String) As ILayer
Dim retLayer As ILayer = Nothing
Dim control As AxMapControl = axMapControl1
For i As Integer = 0 To control.Map.LayerCount - 1
Dim layer As ILayer = control.Map.Layer(i)
retLayer = Me.getLayer(name, layer)
If Not retLayer Is Nothing Then
Exit For
End If
Next
Return retLayer
End Function
Private Function getLayer(ByVal name As String, ByVal layer As ILayer) As ILayer
Dim retLayer As ILayer = Nothing
If TypeOf layer Is ICompositeLayer Then
Dim gLayer As ICompositeLayer = CType(layer, ICompositeLayer)
For i As Integer = 0 To gLayer.Count - 1
Dim l As ILayer = gLayer.Layer(i)
'söker rekursivt efter lagret
retLayer = Me.getLayer(name, l)
If Not retLayer Is Nothing Then
Exit For
End If
Next
Else
If layer.Name.Equals(name) Then
retLayer = layer
End If
End If
Return retLayer
End Function
The code that does the actual IFind. We cast the layer to IFind and use the Find method on the interface. Important to note is that it only work when you search for a value on an attribute, you can't do a custom query on serveral attributes.
Private Function Find(ByVal layer As ILayer, ByVal field As String, ByVal value As String, ByVal activeView As IActiveView) As IGeometry5
Dim findLayer As IFind = CType(layer, IFind)
Dim fields As String() = {field}
'Söker med IFind efter features med attributet satt till value.
Dim array As IArray = findLayer.Find(value, True, fields, activeView.ScreenDisplay.CancelTracker)
Dim polygon As IPolygon5 = Nothing
For i As Integer = 0 To array.Count - 1
Dim featureFindData As IFeatureFindData2 = CType(array.Element(i), IFeatureFindData2)
Dim featureFields As IFields = featureFindData.Feature.Fields
Dim feature As IFeature = featureFindData.Feature
If (polygon Is Nothing) Then
polygon = CType(feature.Shape, IPolygon5)
Else
Dim topOp As ITopologicalOperator6 = CType(feature.Shape, ITopologicalOperator6)
polygon = CType(topOp.UnionEx(CType(polygon, IGeometry), True), IPolygon5)
End If
Next
Return CType(polygon, IGeometry5)
End Function
The same result as I got in the previous blog post, load the layer showing whole US:

And after running the find tool it shows Alaska:
Labels:
ArcGIS Engine,
ArcGIS Server,
ESRI,
IFind,
VB.Net
Friday, February 11, 2011
Zoom-in to feature in ArcGIS Engine using ArcGIS Server and REST
The first blog post on how to use ArcGIS Server from ArcGIS Engine. This post show how to zoom in on a feature using a custom query.
I start by creating JSON query:
Check out the service http://server.arcgisonline.com/ArcGIS/rest/services/Demographics/USA_Median_Household_Income/MapServer/4/query to find out what questions you can ask.
The ZoomTo method looks like this and loops through the result for the features returned and zoom in to the extent of the polygon returned:
I'm making a lot of assumptions here, that the result is a polygon, that there is only one polygon returned. But it shows the concept of getting features using REST.
The test application shows US when I start:

And zoom in on Alaska when I run the test method:

I have not done anything to boost the performance, so it feels very slow.
I start by creating JSON query:
Private Sub TestREST2ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TestREST2ToolStripMenuItem.Click
Dim state As String = "Alaska"
'Skapar fråga för REST:
Dim requestUri As String = "http://server.arcgisonline.com/ArcGIS/rest/services/Demographics/USA_Median_Household_Income/MapServer/4/query"
Dim data As New StringBuilder()
data.AppendFormat("?f={0}", "json")
'case sensitive
data.AppendFormat("&Where=Name%3D'" & state & "'")
data.AppendFormat("&returnGeometry=true")
data.AppendFormat("&returnIdsOnly=false")
data.AppendFormat("&outFields=*")
ZoomTo(requestUri, data.ToString())
End Sub
Check out the service http://server.arcgisonline.com/ArcGIS/rest/services/Demographics/USA_Median_Household_Income/MapServer/4/query to find out what questions you can ask.
The ZoomTo method looks like this and loops through the result for the features returned and zoom in to the extent of the polygon returned:
Sub ZoomTo(ByVal requestUri As String, ByVal data As String)
'Ställer REST frågan:
Dim request As HttpWebRequest = TryCast(WebRequest.Create(requestUri & data), HttpWebRequest)
'Hanterar resultat
Using response As HttpWebResponse = TryCast(request.GetResponse(), HttpWebResponse)
Dim reader As New StreamReader(response.GetResponseStream())
Dim responseString As String = reader.ReadToEnd()
Dim jss As New System.Web.Script.Serialization.JavaScriptSerializer()
jss.MaxJsonLength = 10000000
'Skulle kunna köra med datakontrakt, men då måste man skapa objektstrukturen.
'DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(object))
'Parsar resultatet för att skapa upp polygon.
Dim results As IDictionary(Of String, Object) = TryCast(jss.DeserializeObject(responseString), IDictionary(Of String, Object))
If results IsNot Nothing AndAlso results.ContainsKey("features") Then
Dim features As IEnumerable(Of Object) = TryCast(results("features"), IEnumerable(Of Object))
For Each feature As IDictionary(Of String, Object) In features
Dim geometries As IDictionary(Of String, Object) = TryCast(feature("geometry"), IDictionary(Of String, Object))
Dim polygon As Polygon = New Polygon()
Dim rings As IEnumerable(Of Object) = TryCast(geometries("rings"), IEnumerable(Of Object))
Dim i As Integer = rings.Count()
For Each ring As IEnumerable(Of Object) In rings
Dim pointCol As IPointCollection = New Ring()
For Each vertex As IEnumerable(Of Object) In ring
Dim point As IPoint = New Point()
point.X = Convert.ToDouble(vertex.ElementAt(0))
point.Y = Convert.ToDouble(vertex.ElementAt(1))
pointCol.AddPoint(point)
Next
polygon.AddPointCollection(pointCol)
Next
'Sätter om extent via polygonens
Dim control As AxMapControl = axMapControl1
control.ActiveView.Extent = TryCast(polygon, IPolygon).Envelope
control.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewAll, Nothing, Nothing)
'GetLegend()
'Dim attributes As IDictionary(Of String, Object) = TryCast(feature("attributes"), IDictionary(Of String, Object))
Next
End If
End Using
End Sub
I'm making a lot of assumptions here, that the result is a polygon, that there is only one polygon returned. But it shows the concept of getting features using REST.
The test application shows US when I start:

And zoom in on Alaska when I run the test method:

I have not done anything to boost the performance, so it feels very slow.
Labels:
ArcGIS Engine,
ArcGIS Server,
ESRI,
REST,
VB.Net
Wednesday, February 02, 2011
Demo ArcGIS for WP7 avklarad.
Har haft en Demo om ArcGIS for WP7.
Gjorde en Julgransinventerings App som borde vara intressant för alla som gått traskat runt i en halv meter snö strax innan jul någon gång och sökt en julgran.
Huvudsidan visar sverige och eventuellt inventerade julgranar.

Väljer man att skapa en ny julgran, så kommer man till en annan sida. Där man automatiskt får en GPS punkt och kan välja att fota Julgranen och skriva lite info.

När man sparar så kommer man tillbaka till huvudsidan. Där en ny skapade julgranen syns.
Gjorde en Julgransinventerings App som borde vara intressant för alla som gått traskat runt i en halv meter snö strax innan jul någon gång och sökt en julgran.
Huvudsidan visar sverige och eventuellt inventerade julgranar.
Väljer man att skapa en ny julgran, så kommer man till en annan sida. Där man automatiskt får en GPS punkt och kan välja att fota Julgranen och skriva lite info.
När man sparar så kommer man tillbaka till huvudsidan. Där en ny skapade julgranen syns.
Xap packaging failed. Could not find file...
Hade en demo av Windows Phone 7 idag och fick följande fel "Xap packaging failed. Could not find file.."

Det visade sig mycket riktigt bero på att filen saknades. Berodde på att jag duktig som jag är flyttat in projekten i en underkatalog inför Demon. Lade till filen och allt fungerade som det skulle.
Det visade sig mycket riktigt bero på att filen saknades. Berodde på att jag duktig som jag är flyttat in projekten i en underkatalog inför Demon. Lade till filen och allt fungerade som det skulle.
Tuesday, February 01, 2011
VS ger felmeddelande "Could not load file or assembly..." på 64bit maskin
Råkat ut för det här felmeddelandet några gånger nu "Could not load file or assembly..." Bloggar om detta så jag kanske kommer ihåg det tills nästa gång.
Får man felmeddelandet "Could not load file or assembly..." när man kör igång en applikation på en 64bitars maskin. Så kan det bero på att man refererar 32 bitars DLL:er i projektet. Om VS är satt på att bygga för "Any CPU" i Configuration Manager, så får man detta felmeddelande. Sätter man om projektet till att bygga "x86" istället så går det att köra projektet, detta gör man genom att lägga till "new" i solution plattform i Configuration manager.
Får man felmeddelandet "Could not load file or assembly...
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:
Huvudfönstret:
Först bygger man en prototyp i (Microsoft Expression Blend) SketchFlow.
Skapa nytt objekt:
Sen "the real deal" mha ArcGIS for WP7:
Labels:
ArcGIS for Windows Phone 7,
Sketchflow,
vs2010,
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:
Skall vara:
<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
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
Labels:
Microsoft,
prism,
Silverlight,
Värt att Veta,
WPF
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.
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.
Labels:
ESRI,
ESRI ArcGIS Silverlight,
Microsoft,
Sketchflow,
Värt att Veta
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:
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å:
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:
- Kom ihåg att när VS2010 klagar på att Zune software inte är installerad, så beror det på att man ska ställa om och köra projektet så att den deployar på emulatorn. Se: http://social.msdn.microsoft.com/Forums/en-US/windowsphone7series/thread/ec49dab8-37c6-44ce-ad67-7429338677fc/
- Kom ihåg att göra unblock på ArcGIS API for Windows Phone 2.1 zip-fil innan den zippas upp annars så får VS spunk.
- PDF:en som följde med innehåller XAML kod som inte fungerar, ta bort radbrytning, se min forum postning: http://forums.arcgis.com/threads/14735-ServiceError-with-Code-400-but-no-error-message.
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
Labels:
ArcGIS Engine,
ArcObjects,
dotNet,
ESRI,
Kodning
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.
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
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:
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:
http://social.msdn.microsoft.com/Forums/en-US/tfspowertools/thread/f4595ff1-059c-4a33-a3c6-2f22961a73c7
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
Subscribe to:
Posts (Atom)