Thursday, January 2, 2014

Esri and Smallworld in danger of irrelevance by open geo?

(The headline is simple sensationalism to get eyeballs)

But I do think irrelevance is something that GE Smallworlds needs to think about.

Read http://boundlessgeo.com/press-release/top-esri-sales-executive-joins-opengeo/

I wonder if GE's Smallworld product will experience similar move-to-open pressures that ESRI is responding to?  Maybe it already is but I have not seen any public-facing evidence of that.

ESRI is actively acknowledging Open Source and I imagine that it is doing so in order to stay ahead of the game (http://www.esri.com/news/arcnews/spring11articles/open-source-technology-and-esri.html).  But when you read the article that says that one of ESRI's top federal agency account managers has moved to OpenGeo, it makes me wonder if all the "getting in front of open source" is not enough to control the trend.

One of the first blog posts I ever wrote was "Smallworld Open Source Software".  I read it again today and was amazed that not much has changed in the Smallworld community as it relates to open source.  The comments to the post are definitely worth reading.

I used to think that the version managed datastores (VMDS) were something that set Smallworld above its competition.  In my unscientific analysis, I actually think it did/does provide better functionality than the ESRI and Oracle workspaces/versioning, etc.  What seems to have snuck up without too much fanfare are the open-source projects like GeoGit that are also trying to address this issue.  In addition, github announced in June 2013 that it now supports rendering GeoJSON and TopoJSON.  I realize that GeoJSON and TopoJSON are not necessarily good matches for some of the complex networks modelled by Smallworld users.  It is interesting that open tools like git are being pushed to support the same issues that Smallworld was originally designed to address (versioning and distributed data).

I think that if GE does not open up Smallworld to a wider community it runs the risk of becoming irrelevant.   I am sure that the irrelevance will not happen overnight.  But if GE keeps fighting the GIS war with ESRI without considering projects like GeoGit, we could be in for an interesting few years in the Smallworld realm.

Tuesday, November 5, 2013

WebMapsConnector for Smallworld Supports basemap.at

As you may be aware, iFactor Consulting's Web Maps Connector (WMC) for Smallworld allows Smallworld users to seamlessly integrate both global and regional data sets in their Smallworld thick client.

Today I want to share with you that WMC now supports data layers from http://basemap.at (The most recent Administrative basemap of Austria).



While I have mentioned in a previous post that access to datasets like Google do provide value to the Smallworld user, I have also seen a movement in this domain towards regionally-generated data sources.  basemap.at falls into that category of regional datasets supported by WMC joining already supported datasets from Thailand (Longdo Maps), Japan (NTT Geospace Imagery and Road Tile) and North Korea (Naver Maps).

If you have a regional tile-based map that you would like to show in Smallworld, please contact the Web Maps Connector team with your request.

Friday, August 23, 2013

Insert coordinates from text file into Smallworld database

I recently received a query from a reader asking if I could show him how to insert coordinates from a text file into Smallworld database.  I have put together a gist that shows how to do this.  I started off by using a LWT approach but then remembered that the recommended approach is to use the record transaction APIs.  So the gist includes both styles of database writing.


_package sw
$
_global coordinate_importer <<
_proc@coordinate_importer(filename)
## coordinate_importer(STRING filename) : unset
##
## parses FILENAME and inserts records into database
## assumes the format...
## x|y|description
## with the first line being the header line
## and x=Longitude (decimal degrees)
## and y=Latitude (decimal degrees)
# the x/y values we get from the coordinate file are in
# lat/long so we need to set the !current_coordinate_system!
# value here so that those lat/long values automagikally get
# transformed into whatever the current database coordinate
# system is.
_dynamic !current_coordinate_system! << coordinate_system.new_proj_long_lat(:wgs84,:degree)
_constant DELIMITER << "|"
_local str , line , values , x , y , description
_local v << gis_program_manager.cached_dataset(:gis)
# set the !current_dsview! and !current_world!
_dynamic !current_dsview! << v
_dynamic !current_world! << v.world
_local coll << v.collections[:town]
_local ok? << _false
v.start_lwt()
_protect
str << external_text_input_stream.new(filename)
str.get_line() # skip the header line
_loop
_if (line << str.get_line()) _is _unset
_then
_leave
_endif
values << line.split_by(DELIMITER)
_local ndr << coll.new_detached_record()
ndr.name << values[3] # description
ndr.class << "City"
_local rec << coll.insert(ndr)
_local coord << coordinate(values[1].as_number(),values[2].as_number())
rec.make_geometry(:location,coord)
rec.make_geometry(:annotation,coord,rec.name)
_endloop
ok? << _true
_protection
v.end_lwt(ok?)
_if str _isnt _unset
_then
str.close()
_endif
_endprotect
_endproc
$
# MagikSF> coordinate_importer("C:\Users\Alfred\Desktop\coordinates.txt")
# $
_package sw
$
_global coordinate_importer <<
_proc@coordinate_importer(filename)
## coordinate_importer(STRING filename) : unset
##
## parses FILENAME and inserts records into database
## assumes the format...
## x|y|description
## with the first line being the header line
## and x=Longitude (decimal degrees)
## and y=Latitude (decimal degrees)
# the x/y values we get from the coordinate file are in
# lat/long so we need to set the !current_coordinate_system!
# value here so that those lat/long values automagikally get
# transformed into whatever the current database coordinate
# system is.
_dynamic !current_coordinate_system! << coordinate_system.new_proj_long_lat(:wgs84,:degree)
_constant DELIMITER << "|"
_local str , line , values , x , y , description
_local v << gis_program_manager.cached_dataset(:gis)
_local coll << v.collections[:town]
_protect
str << external_text_input_stream.new(filename)
str.get_line() # skip the header line
_loop
_if (line << str.get_line()) _is _unset
_then
_leave
_endif
values << line.split_by(DELIMITER)
_local name << values[3] # description
_local coord << coordinate(values[1].as_number(),values[2].as_number())
_local location << pseudo_point.new(coord)
_local annotation << pseudo_text.new(coord,name)
_local properties << property_list.new_with(:name,name,
:class,"City",
:location,location,
:annotation,annotation)
_local t << record_transaction.new_insert(coll,
properties,
"Insert Town")
t.run()
_endloop
_protection
_if str _isnt _unset
_then
str.close()
_endif
_endprotect
_endproc
$
# MagikSF> coordinate_importer("C:\Users\Alfred\Desktop\coordinates.txt")
# $
x|y|description
-0.1271|51.51|London, UK
-2.249|53.48|Manchester, UK
-1.260|51.76|Oxford, UK
-0.1341|50.83|Brighton, UK
-6.248|53.35|Dublin, Ireland
view raw coordinates.txt hosted with ❤ by GitHub