|
POST
|
Another thing you can try is, in ArcPad Studio, use Tools > Compact AXF Database
... View more
11-13-2017
09:25 PM
|
2
|
0
|
866
|
|
POST
|
Sorry Ingrid, ArcPad only supports alpha channel supplied in an additional band. For instance, RGBA. If you can create the alpha channel band. A 32-bit TIFF image containing 8-bit for each channel and the last with the Alpha channel will have the following TIFF tags set: TIFF Tag 258 Bits Per Sample (e.g. 😎 TIFF Tag 262 Photometric Interpretation (e.g. PHOTOMETRIC_RGB = 2) TIFF Tag 338 Extra Samples (e.g. 1)
... View more
11-13-2017
01:15 PM
|
0
|
0
|
886
|
|
POST
|
Hi Faith, for Windows Mobile, we tried to conserve memory by not loading all the extensions. TIFF and MrSID may be turned off, to ensure that it's enabled for your project, follow the following steps: Tools > Advanced Settings Extensions tab Verify that MrSID is checked Verify that TIFF is checked After you complete the above, ArcPad should identify your images.
... View more
11-07-2017
04:24 PM
|
1
|
7
|
1668
|
|
POST
|
Open the AXF in ArcPad Studio. Right click and select "Command..." then, the rest is SQL awesomeness. For example, querying the sync properties can be done by: SELECT *
FROM AXF_PROPERTIES
WHERE NAME = 'AXF_SYNC_PROPERTIES';
Syntax for changing it is: UPDATE AXF_PROPERTIES
SET VALUE = '...'
WHERE NAME = 'AXF_SYNC_PROPERTIES'; If the property doesn't exist, syntax for creating it is: INSERT INTO AXF_PROPERTIES (NAME, VALUE)
VALUES (
'AXF_SYNC_PROPERTIES',
'...'
); You can even execute the statement in an ArcPad applet with something like: Map.Layers(1).DataSource.Execute sql
... View more
10-16-2017
03:04 PM
|
3
|
1
|
676
|
|
POST
|
Check Customize > Extensions 1. Check if ArcPad Data Manager is in the list, if so, check it Check Customize > Customize Mode 1. Check ArcPad Data Manger toolbar is in the list, if so, check it 2. If not, select Add From File 3. Navigate to C:\Program Files (x86)\ArcGIS\ArcPad10.2\DesktopTools10.0 4. Select ArcPadToolsGen2.dll 5. Click yes to all the ESRI Assembly Registration Utility questions If you are having issues with ArcPadToolsGen2.dll you may need to install some prerequisites, for example, the Microsoft Visual Studio 2008 C++ Runtime.
... View more
10-05-2017
02:33 PM
|
1
|
0
|
707
|
|
POST
|
Hi David, I understand the ArcPad AXF support is built into the Data Interoperability extension that's included in ArcGIS Desktop. You only have to enable it. It shouldn't require any additional licensing. With the Get Data From ArcPad processing window, sounds like some troubleshooting is required. I would open ArcPad Studio and review the AXF_STATUS column of the data you're checking in (right click > Show Data) and compare it with the well known Status codes documented in ArcPad Developer Help - Concepts. If it's data to be checked in value sholud be AXF_STATUS_CREATED or 1. If it isn't you will need to enter the SQL command UPDATE tableName
SET AXF_STATUS = 1, AXF_TIMESTAMP = getdate()
WHERE AXF_STATUS <> 1 The WHERE clause is actually optional, you can leave that out, but, I left it in there so that you can see the recommend pattern and replace that condition with whatever you want so that only records you want checked in will be checked in. Otherwise, leave the WHERE clause off and it will mark every record as "New" and ArcPad Data Manager will attempt to check them all in. Stephen
... View more
08-09-2017
02:36 PM
|
0
|
0
|
1368
|
|
POST
|
The capability has been in there since ArcGIS 10.1. See http://resources.arcgis.com/en/help/arcpad/10.2/app/index.html#//00s10000013p000000
... View more
08-08-2017
06:57 PM
|
1
|
1
|
996
|
|
POST
|
Hi David, First, I wanted to confirm that a crucial part of those steps is that with the new GeoDatabase, you create a matching, but blank AXF. That has the new AXF_TRANSACTION_LOG that you want. That's crucial. That's the correct AXF_TRANSACTION_LOG that you want to paste into your AXF to make those steps work. If you did all that meticulously and it's still not working, then we can try switching tracks and go for the ArcGIS Data Interoperability for Desktop extension to bringing your data in. http://resources.arcgis.com/en/help/arcpad/10.2/app/index.html#//00s10000013p000000 Stephen
... View more
08-08-2017
05:21 PM
|
0
|
2
|
1368
|
|
POST
|
If you create a brand new geodatabase that is similar in nature to the original one, you can reconnect your AXF to the new geodatabase. How To: Alter the source database of a checked-in AXF file
... View more
08-08-2017
03:54 PM
|
1
|
4
|
1368
|
|
POST
|
See ARCPADAXF in Supported formats with the Data Interoperability extension—Help | ArcGIS Desktop .
... View more
08-08-2017
02:42 PM
|
1
|
3
|
996
|
|
BLOG
|
Summary This is the second blog about the SQL Beta feature in AppStudio 2.0. If you haven't seen the first blog, I recommend you start there. In this blog, we will discuss SQLite In-Memory databases and CSV files and how this may benefit your application. 1. SQLite In-Memory Database The ":memory:" name is used to specify the in-memory database. This is useful for applications that would like to start with a blank SQLite database every time the application is run and do not need the data to persist after the application has completed. This is useful for providing model content to populate controls. import QtQuick 2.7
import QtQuick.Controls 2.1
import ArcGIS.AppFramework 1.0
import ArcGIS.AppFramework.Sql 1.0
App {
id: app
width: 640 * AppFramework.displayScaleFactor
height: 480 * AppFramework.displayScaleFactor
ComboBox {
id: countryComboBox
readonly property var _model: model
textRole: "country"
}
SqlDatabase {
id: db
databaseName: ":memory:"
}
Component.onCompleted: {
db.open();
db.query("CREATE TABLE world_cities (name TEXT,subcountry TEXT, country TEXT)");
db.query("INSERT INTO world_cities VALUES ('Melbourne', 'Victoria', 'Australia')");
db.query("INSERT INTO world_cities VALUES ('Redlands', 'California', 'United States')");
countryComboBox.model = db.queryModel('SELECT DISTINCT country FROM world_cities');
}
}
2. Bundling CSV files in your app If you have data in a CSV file, we can create a linked table in SQLite. As a linked table only the metadata, i.e. filename to the CSV file is stored in SQLite, the content will continue to reside only in the CSV file. The CSV file can be either a physical file or an embedded resource. The syntax to linking tables is as follows: CREATE VIRTUAL TABLE tableName USING CSV ( 'filePath' ) The advantage of using technique is that you will have access to your CSV data via the SQLite query engine. When we're developing the application we will be using: CREATE VIRTUAL TABLE world_cities USING CSV ( 'C:/Users/Stephen/ArcGIS/AppStudio/Apps/Sample/data/world-cities.csv' ) When we've finalized the application and want to build it using Local Make or Cloud Make, we want to change it to: CREATE VIRTUAL TABLE world_cities USING CSV ( ':/qml/data/world-cities.csv' ) To achieve both we will use the FileFolder object to help. SqlDatabase {
id: db
databaseName: ":memory:"
}
FileFolder {
id: dataFolder
url: "data"
}
Component.onCompleted: {
var csvFilePath = dataFolder.filePath("world-cities.csv");
db.open();
db.query("CREATE VIRTUAL TABLE world_cities USING CSV ( '" + csvFilePath + "' )");
countryComboBox.model = db.queryModel('SELECT DISTINCT country FROM world_cities');
} 3. ComboBox with Huge Data By leveraging from the SQLite query engine we can build quite compelling user interfaces quickly and simply. In the following example, instead of asking the user to select from a list of 20,000 cities, we can filter the list with a WHERE clause on country and subcountry. cityComboBox.model = db.queryModel(
"SELECT name "
+ "FROM world_cities "
+ "WHERE country = :country "
+ "AND subcountry = :subcountry "
+ "ORDER BY name",
{
country: countryComboBox.currentText,
subcountry: subcountryComboBox.currentText
}
); If you are experiencing a lag whenever the queries are run, then, at this point, you will need to consider using SQLite indexes. However, indexes cannot be applied to the linked table. We must make a copy of the table and then we can put indexes on the copy. Component.onCompleted: {
var csvFilePath = dataFolder.filePath("world-cities.csv");
db.open();
db.query("CREATE VIRTUAL TABLE world_cities_csv USING CSV ('" + csvFilePath + "')");
db.query("CREATE TABLE world_cities AS SELECT * FROM world_cities_csv");
db.query("CREATE INDEX IX_world_cities_001 ON world_cities (country, subcountry, name)");
countryComboBox.model = db.queryModel('SELECT DISTINCT country FROM world_cities');
} 4. Known Issues 4.1. Garbage Collection on Models The Javascript garbage collector is prematurely destroying models. For example, the pattern for assigning a query model to a QML component is as follows: countryComboBox.model = db.queryModel( QML components, currently, do not inform the Javascript garbage collector that it has a reference to the model. The Javascript garbage collector *CAN* destroy the model whenever it feels like. This can lead to instability with the QML component. i.e. suddenly the values in the ComboBox may disappear (i.e. be replaced with blanks instead of values) or interacting with the ComboBox may crash the application. A workaround is to define a Javascript property that keeps the model alive. This is the purpose of the readonly _model property in the following code snippet: ComboBox {
id: countryComboBox
readonly property var _model: model
textRole: "country"
} We've informed Qt company of this issue. 4.2 Quoted values If you have quoted values in your CSV file, the values aren't unquoted when you access them. The workaround is you have to add additional logic to identify and remove the extraneous quotes. This issue is being addressed for the next release of AppStudio 4.3 Trailing spaces aren't being trimmed If you have trailing spaces in your CSV, e.g. "country, subcountry" instead of "country,subcountry" then this will cause a problem. For the time being, you will have to trim the trailing spaces from your CSV file. This issue is being addressed for the next release of AppStudio 5. Select City sample The "Select City from CSV" app is available for you to try which demonstrates all of the above points. You can find "Select City from CSV" app in AppStudio. Launch AppStudio Select New App Click Search Icon Type: Select City from CSV The "Select City from CSV" source code is also available at arcgis-appstudio-samples GitHub 6. Other AppStudio SQL Blogs Introduction to SQL Beta in AppStudio 2.0 Using CSV files in your application
... View more
08-07-2017
03:37 PM
|
2
|
2
|
2506
|
|
POST
|
Faith, we made that ArcPad Help PDF and shared it through ArcGIS Online as an experiment. We have not kept that item up to date with the latest content. Having said that, I noticed that Google's search engine has indexed it so many people can find it. I'll make a note for us to do something to futureproof it.
... View more
07-20-2017
11:29 PM
|
0
|
1
|
1837
|
|
POST
|
Hi Chad, ArcPad presently only supports photos via a Picture field. See Picture Options in "Get Data for ArcPad". In http://resources.arcgis.com/en/help/arcpad/10.2/app/index.html#/Get_Data_for_ArcPad/00s100000068000000/ This is a Text field that will contain either a filename or URL to a photo. We do not physically store the JPG inside the AXF. This is part of the design that began when this feature was introduced back in the days of Shapefiles which didn't support the raster type. We allow you to specify a location with "Copy pictures to the folder when checking data" which tells Data Manager how to massage the text string when you do a check in, since, photo filenames on a device need to change when you move to the desktop. We usually recommend you place it on a network location so that when your feature class is opened by another person on the network, they can see the same photos. For those who are publishing the photos to the internet, you could possibly replace the network location with a URL after check in. Since then, attachments has been implemented in the GeoDatabase which shows you a different workflow for working with photos in ArcGIS. That workflow hasn't reach ArcPad as ArcPad still only implements the Picture field method as I've just described. For now, this just means you have two options: 1. Check the ArcPad documentation and follow the strategy for Picture Field and Picture Options 2. Raise an enhancement request to have attachments supported Implementing attachments in ArcPad would not be a trivial thing since, we would have to give some thought on how to handle large files and work with the limitations of a SQL CE database. Stephen
... View more
07-20-2017
11:13 PM
|
0
|
1
|
1030
|
|
BLOG
|
Summary SQL was introduced as a Beta feature in the AppFramework as part of AppStudio 2.0. What this means is we are looking forward to your feedback, use cases and what you want us to improve on. Future changes may affect your app and may require additional changes to support it. In AppStudio 2.0 you can: read/write SQLite, ODBC, PostgreSQL and MySQL databases read DBF files (via SQLite virtual tables) read CSV files (via SQLite virtual tables) To get a taste of the SQL support, we will be covering the following. Minimal app - open a SQLite database Running queries Error handling Looping through results Prepared and parameterized queries Autoincrement field SqlQueryModel and SqlTableModel Including SQL Schema as an app resource SQL Viewer app 1. Minimal app - open a SQLite database This minimal working sample opens a SQLite database in your home directory called ArcGIS/Data/Sql/sample.sqlite. The code works on all platforms. On Android, Linux, Windows and Mac platform, the database created and can be accessed by other apps. On iOS the database will be sandboxed to your application, i.e. only your application may access it. import QtQuick 2.8
import ArcGIS.AppFramework 1.0
import ArcGIS.AppFramework.Sql 1.0
Item {
width: 640
height: 480
FileFolder {
id: fileFolder
path: "~/ArcGIS/Data/Sql"
}
SqlDatabase {
id: db
databaseName: fileFolder.filePath("sample.sqlite")
}
Component.onCompleted: {
fileFolder.makeFolder();
db.open();
}
} 2. Running queries To run a SQL query, we use the SqlDatabase's query method. This function is overloaded, i.e. there are multiple, very useful ways of calling query. The most simplest is passing in a single string parameter and that query will be prepared and executed all in one go. var query = db.query("SELECT COUNT(*) as Count FROM sqlite_master");
if (query.first()) {
console.log(query.values.Count);
query.finish();
} 3. Error handling If the query failed, the error parameter would be not null. You can test for it, and, if it exists, it will be set to a JSON error object. var query = db.query("CRAP");
if (query.error) {
console.log(JSON.stringify(query.error, undefined, 2));
} else {
// success
} Output: {
"isValid": true,
"type": 2,
"databaseText": "near \"CRAP\": syntax error",
"driverText": "Unable to execute statement",
"text": "near \"CRAP\": syntax error Unable to execute statement",
"nativeErrorCode": "1"
} 4. Looping through results If your query is a select statement, it will return data via the values JSON object property. The values property will contain values corresponding to one row of results. To get all the results we need to access them in a loop. Note that when we iterate through results, it's always important to call finish(). If you forget, the query could lock the database in an unfinished transaction which may prevent future operations such as DROP TABLE. var query = db.query("SELECT * FROM Roads");
var ok = query.first();
while (ok) {
console.log(JSON.stringify(query.values));
ok = query.next();
}
query.finish(); Output: qml: {"RoadID":1,"RoadName":"Coventry","RoadType":"St"}
qml: {"RoadID":2,"RoadName":"Sturt","RoadType":"St"}
qml: {"RoadID":3,"RoadName":"Kings","RoadType":"Way"} 5. Prepared and parameterized queries A number of commands have been overloaded to support parameterized syntax. Using parametized queries diligently can stop accidental bugs or malicious attacks via SQL injection. You can bind to a parameter via name (e.g. ":name") or via position (e.g. "?"). In practice, I always recommend binding parameters by name, because it's stricter and safer. Parameterized queries go well with prepared queries. This is when you offer one SQL statement for repeated execution. The following shows how you can use this approach to populate a table. var insert = db.query();
insert.prepare("INSERT INTO Roads (RoadName, RoadType) VALUES (:name, :type)");
insert.executePrepared( { "name": "Bank", "type": "St" } );
insert.executePrepared( { "name": "Dorcas", "type": "St" } ); 6. Autoincrement field If your table has an autoincrement field you may want to query its value so that you can use it. This is useful if that field is used in a relationship. i.e. you want to populate a related table using the value of the autoincrement field. The value of the last autoincrement operation is in the insertId property. var query = db.query("INSERT INTO Roads (RoadName, RoadType) VALUES ('Park', 'St')");
var roadID = query.insertId;
var query2 = db.query(
"INSERT INTO Inspections (RoadID, Quality) VALUES (:id, :quality)",
{ "id": roadID, "quality": "good" } ); 7. SqlQueryModel and SqlTableModel SqlQueryModel and SqlTableModel are a read-only data model for SQL result sets. The following demonstrates how you can populate a TableView using a SqlQueryModel. import QtQuick 2.8
import ArcGIS.AppFramework 1.0
import ArcGIS.AppFramework.Sql 1.0
Item {
width: 640
height: 480
TableView {
id: tableView
anchors.fill: parent
TableViewColumn {
role: "RoadID"
title: "Road ID"
}
TableViewColumn {
role: "RoadName"
title: "Road Name"
}
TableViewColumn {
role: "RoadType"
title: "Road Type"
}
}
FileFolder {
id: fileFolder
path: "~/ArcGIS/Data/Sql"
}
SqlDatabase {
id: db
databaseName: fileFolder.filePath("sample.sqlite")
}
Component.onCompleted: {
fileFolder.makeFolder();
db.open();
var queryModel = db.queryModel("SELECT * FROM Roads");
tableView.model = queryModel;
}
} Output: 8. Including SQL Schema as an app resource To reduce the amount of JavaScript code, you may choose to initialize a SQLite database using a SQL Schema written in SQL. For example the following initdb.sql resets the SQLite database with a new Roads database every time the app is run: DROP TABLE IF EXISTS Roads;
CREATE TABLE Roads
(
RoadID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
RoadName TEXT,
RoadType TEXT,
CHECK (RoadType IN ('St', 'Rd', 'Way'))
);
INSERT INTO Roads (RoadName, RoadType) VALUES ('Coventry', 'St');
INSERT INTO Roads (RoadName, RoadType) VALUES ('Sturt', 'St');
INSERT INTO Roads (RoadName, RoadType) VALUES ('Kings', 'Way');
CREATE INDEX IX_Roads_001 ON Roads (RoadName);
CREATE INDEX IX_Roads_002 ON Roads (RoadType); Qt Creator will recognize SQL files if you add the *.sql filter to the qmlproject file as shown here: Files {
directory: "."
recursive: true
filter: "*.json;*.html;*.txt;*.sql"
} Place the initdb.sql file into a scripts subdirectory and use the following code to load it: FileFolder {
id: scriptsFolder
url: "scripts"
}
Component.onCompleted: {
dataFolder.makeFolder();
db.open();
var lines = scriptsFolder.readTextFile("initdb.sql").split(";");
for (var i = 0; i < lines.length; i++) {
var sql = lines[i];
var query = db.query(sql);
if (query.error) {
console.log(JSON.stringify(query.error, undefined, 2));
continue;
}
}
}
Note that this example recognizes we can extract SQL commands by recognize each command is terminated by a semicolon. For more sophisticated SQL Schema involving triggers we will need to adapt the loading code appropriately. 9. SQL Viewer The "SQL Viewer" app is available for you to try which demonstrates all of the above points. You can find a "SQL Viewer" app in AppStudio: Launch AppStudio Select New App Click Search Icon Type: SQL Viewer The "SQL Viewer" source code is also available at arcgis-appstudio-samples/SQL Viewer at v2.0 · Esri/arcgis-appstudio-samples · GitHub 10. Other AppStudio SQL Blogs Introduction to SQL Beta in AppStudio 2.0 Using CSV files in your application
... View more
07-19-2017
09:08 PM
|
4
|
0
|
10507
|
|
POST
|
Hi Gideon, That's a good question. Whilst I told you to just supply the server URL (i.e. http://gis:6080) when doing an Add Data from Server, the URL you need to give for "Add feature service URL to AXF" is the deeper REST API for your feature service. It would look something like: https://external/arcgis/rest/services/GIS_MAP/FeatureServer When you expose a Feature Service externally, it is up to you to choose the URLs and how they map to your internal server. e.g. you may say that https://external/arcgis/ maps to http://gis:6080/arcgis/ - it's really up to you (website administrator) to choose how much or how little of your Feature Service you want to expose. Stephen
... View more
07-19-2017
06:30 PM
|
0
|
2
|
795
|
| Title | Kudos | Posted |
|---|---|---|
| 1 | 03-13-2023 08:11 PM | |
| 2 | 02-21-2023 07:29 PM | |
| 1 | 06-19-2019 05:33 PM | |
| 1 | 06-19-2019 01:00 AM | |
| 1 | 02-02-2016 03:09 PM |
| Online Status |
Offline
|
| Date Last Visited |
08-02-2024
07:12 AM
|