Monday, March 25, 2013

Build the basic liblas for 64 bit Windows (no GDAL and GeoTIFF support)

In order to build 64 bit Windows binaries of liblas, the header files and 64 bit binaries for Boost must be accessible by Microsoft Visual Studio. The CMake utility from http://www.cmake.org needs to be used to configure and generate the Microsoft Visual Studio project files for liblas. The following illustrates how I build the basic liblas 64 bit binaries (no GDAL or GeoTIFF support). Note that the 64-bit executables may not run successfully even though the compilation is successful depending on how the source code was written.
  1. Download the latest liblas source code from http://www.liblas.org/download.html. Extract the files to a folder e.g. E:\Work\src\liblas-1.7.0\.
  2. On the Windows Desktop, select Start | All Programs | CMake 2.8 | CMake (cmake-gui).

    The CMake application appears.
  3. In the Where is the source code field, click Browse Source.

    The Browse for Folder dialog box appears.
  4. Select the folder where the liblas archive was extracted, e.g. E:\Work\src\libLAS-1.7.0\. Click OK.
  5. In the Where to build the binaries field, click Browse Build.

    The Browse for Folder dialog box appears.
  6. Select or create the folder where the Microsoft Visual Studio solution project files will be created e.g. E:\Work\src\libLAS-1.7.0\bin\. Click OK.

  7. Click Configure.

    A prompt appears.
  8. In the combo box, choose a generator for this project e.g. Visual Studio 10 Win64. Click Finish.

    A Error message appears.
  9. Close the message.

  10. In the list box, select Boost_INCLUDE_DIR. Then click the browse [...] button.

    The Browse For Folder dialog box appears.
  11. Choose the root folder containing Boost e.g. E:\Work\src\boost_1_52_0\. Click OK.

    Note: the boost folder containing the header include files should be underneath the root folder.
  12. Click Configure again.

    The configuration files are created.
  13. Click Generate.

    The Microsoft Visual Studio project files are generated the specified destination build folder.
  14. Close CMake.
  15. Run Microsoft Visual Studio 2010. Open up the libLAS.sln file.
  16. Press F7 to build all the projects.

    The 64 bit liblas binaries are generated.

Monday, March 18, 2013

Simple Android app for converting between GPS Week/Seconds Time and local date time

The date time used by the Global Positioning System (GPS) is normally expressed as a week number and a seconds-of-week number. This format is not as easy to work with as a normal calendar date time. I made this simple Android App for converting the GPS Time (in week and seconds-of-week format) and local calendar date time (in UTC+offset format), which is easier to work with. It has the option to choose which local UTC time zone to use for conversion. The app will automatically adjust the local time for GPS leap seconds.

Clicking on the buttons will bring up pickers for selecting the input values, as shown below. 

Get it on Google Play

Monday, March 11, 2013

Build 64 bit GDAL for Windows

In building libLAS from source, there is the option of linking it with GDAL. Since I was interested in making 64 bit Windows version of libLAS, I had to find or make my own 64 bit versions of GDAL. Eventually, I decided to build my own. The following are the steps I did to compile 64 bit GDAL on Microsoft Visual Studio 2010. Note that the 64 bit executables may not run successfully depending on the source code even if the compilation is successful.
  1. Download the latest GDAL source code from http://download.osgeo.org/gdal/. Extract the files into a folder e.g. C:\Work\src\gdal-1.9.2\.
  2. On the Windows Desktop, select Start | All Programs | Microsoft Visual Studio 2010 | Visual Studio Tools | Visual Studio x64 Win64 Command Prompt.

    The Visual Studio x64 Win64 Command Prompt appears.
  3. In the Command Prompt, change directory to the extracted GDAL source code root folder.

    C:\> cd \Work\src\gdal-1.9.2
  4. Build the GDAL 64 bit Windows binaries with the nmake command.

    C:\> nmake /f makefile.vc MSVC_VER=1600 WIN64=YES

    The binaries are generated.

Monday, March 4, 2013

How to build 64-bit versions of libgeotiff for Windows

I could not find 64-bit binaries of the open-source libGeotiff library so I decided to download the most recent source code from http://trac.osgeo.org/geotiff/ so that I could use Microsoft Visual Studio 2010 to compile make my own. Other libraries are also required so I downloaded the latest source code for libTiff from http://download.osgeo.org/libtiff/ and Proj4 from http://trac.osgeo.org/proj/. I have no problems compiling libTiff and Proj4 as is but I had to modify the libGeotiff's makefile.vc file to make it compile successfully. Note that successful compilation does not necessarily mean the 64 bit executables will run successfully.



Compile 64 bit version of Proj4
  1. Extract the Proj4 source code into a folder e.g. C:\Work\src\proj-4.8.0\
  2. Select Start | All Programs | Microsoft Visual Studio 2010 | Visual Studio Tools | Visual Studio x64 Win64 Command Prompt.

    The Win64 Command Prompt appears.
  3. In the Command Prompt, type in and enter the following:

    C:\> cd \Work\src\proj-4.8.0
  4. Run the nmake build command in the Command Prompt:

    C:\> nmake /f makefile.vc

    The 64 bit version of Proj4 is created.
Compile 64 bit version of libTiff
  1. Extract the libTiff source code into a folder e.g. C:\Work\src\tiff-4.0.3\.
  2. Open up the Win64 Command Prompt if it is not  already on the screen.
  3. In the Command Prompt, type in the following command.

    C:\> cd \Work\src\tiff-4.0.3\
  4. Run the nmake build command in the Command Prompt.

    C:\> nmake /f makefile.vc

    The 64 bit version of libTiff is created.
Compile 64-bit version of libGeotiff
  1. Extract the libGeotiff source code into a folder e.g. C:\Work\src\libgeotiff-1.4.0\.
  2. Use a text editor to open up the header file geo_config.h. Add in the line #define BUILD_AS_DLL 1 as shown in red below.

    /* geo_config.h.  Generated from geo_config.h.in by configure.  */
    #ifndef GEO_CONFIG_H
    #define GEO_CONFIG_H
    
    #define BUILD_AS_DLL 1
    
    /* Define if you have the ANSI C header files.  */
    #define STDC_HEADERS 1
    
    /* Define if you have the <stdlib.h> header file.  */
    #define HAVE_STDLIB_H 1
    
    /* Define if you have the <string.h> header file.  */
    #define HAVE_STRING_H 1
    
    /* Define if you have the <strings.h> header file.  */
    #define HAVE_STRINGS_H 1
    
    #define HAVE_LIBPROJ 1
    /* #undef HAVE_PROJECTS_H */
    
    #endif /* ndef GEO_CONFIG_H */
    

  3. Use a text editor to open up the libGeotiff's makefile.vc file.
  4. Replace the contents of makefile.vc with the contents below.

    Note: the parts that were modified are colored in red.

    #
    # Typically the only thing that needs to be changed are the paths to the
    # TIFF tree.  Note that we expect an existing build tree, in part because we
    # need private include files from libtiff, but also we need access to getopt.h.
    # in the ports directory.
    #
    # You may want to add optimization options to the CFLAGS macro as well. 
    #
    
    TIFF = C:\Work\src\tiff-4.0.3
    PROJ4 = C:\Work\proj-4.8.0
    
    TIFF_INC = -I$(TIFF)\libtiff
    TIFF_LIB = $(TIFF)\libtiff\libtiff.lib
    TIFF_LIB_DLL = $(TIFF)\libtiff\libtiff_i.lib
    PROJ4_INC = -I$(PROJ4)\src
    PROJ_LIB = $(PROJ4)\src\proj.lib
    PROJ4_LIB_DLL = $(PROJ4)\src\proj_i.lib
    
    # Installation locations (with install, or devinstall targets)
    PREFIX =    release    
    BINDIR =    $(PREFIX)\bin
    LIBDIR =    $(PREFIX)\lib
    INCDIR =    $(PREFIX)\include
    DATADIR =    $(PREFIX)\share\epsg_csv
    
    #
    CC      = cl
    INCL    = -I. -Ilibxtiff $(TIFF_INC) $(PROJ4_INC)
    
    
    # Pick the first LIBS definition for a static libtiff.lib or the second
    # to link against the libtiff DLL.
    
    #LIBS    = geotiff.lib $(TIFF_LIB) $(PROJ4_LIB)
    LIBS    = geotiff_i.lib $(TIFF_LIB_DLL) $(PROJ4_LIB_DLL)
    
    DLLNAME = geotiff.dll
    
    # Set optimization or debug flags here.
    CFLAGS  = $(INCL) /MD /Ox /nologo
    #CFLAGS  = $(INCL) /MD /Zi /nologo
    
    #
    OBJS    = \
        xtiff.obj \
        geo_free.obj \
        geo_get.obj \
        geo_names.obj \
        geo_new.obj \
        geo_print.obj \
        geo_set.obj \
        geo_tiffp.obj \
        geo_write.obj \
        geo_extra.obj \
        geo_trans.obj \
        geo_normalize.obj \
        geotiff_proj4.obj \
        geo_simpletags.obj \
        cpl_csv.obj \
        cpl_serv.obj
    
    all:    geo_config.h geotiff.lib $(DLLNAME) listgeo.exe geotifcp.exe
    
    listgeo.exe:    bin\listgeo.c geotiff.lib
        $(CC) $(CFLAGS) bin\listgeo.c $(LIBS)
        
    geotifcp.exe:    bin\geotifcp.c geotiff.lib
        $(CC) $(CFLAGS) bin\geotifcp.c bin\getopt.c $(LIBS)
        
    gt_update.exe:    bin\gt_update.c geotiff.lib
        $(CC) $(CFLAGS) bin\gt_update.c bin\getopt.c geotiff.lib $(LIBS)
        
    geotiff.lib:    $(OBJS)
        lib /out:geotiff.lib $(OBJS)
    
    #
    $(DLLNAME):    $(OBJS)
        link /dll /out:$(DLLNAME) /implib:geotiff_i.lib $(OBJS) $(TIFF_LIB_DLL) $(PROJ4_LIB_DLL)
        if exist $(DLLNAME).manifest mt -manifest $(DLLNAME).manifest -outputresource:$(DLLNAME);2
    
    geo_config.h:    geo_config.h.vc
        copy geo_config.h.vc geo_config.h
    
    xtiff.obj: libxtiff\xtiff.c
        $(CC) -c $(CFLAGS) libxtiff\xtiff.c
    
    geo_free.obj: geo_free.c
        $(CC) -c $(CFLAGS) geo_free.c
    
    geo_get.obj: geo_get.c
        $(CC) -c $(CFLAGS) geo_get.c
    
    geo_names.obj: geo_names.c
        $(CC) -c $(CFLAGS) geo_names.c
    
    geo_new.obj: geo_new.c
        $(CC) -c $(CFLAGS) geo_new.c
    
    geo_print.obj: geo_print.c
        $(CC) -c $(CFLAGS) geo_print.c
    
    geo_set.obj: geo_set.c
        $(CC) -c $(CFLAGS) geo_set.c
    
    geo_tiffp.obj: geo_tiffp.c
        $(CC) -c $(CFLAGS) geo_tiffp.c
    
    geo_write.obj: geo_write.c
        $(CC) -c $(CFLAGS) geo_write.c
    
    geo_trans.obj: geo_trans.c
        $(CC) -c $(CFLAGS) geo_trans.c
    
    geo_extra.obj: geo_extra.c
        $(CC) -c $(CFLAGS) geo_extra.c
    
    geo_normalize.obj: geo_normalize.c
        $(CC) -c $(CFLAGS) geo_normalize.c
    
    geotiff_proj4.obj: geotiff_proj4.c
        $(CC) -c $(CFLAGS) geotiff_proj4.c
    
    cpl_csv.obj: cpl_csv.c
        $(CC) -c $(CFLAGS) cpl_csv.c
    
    cpl_serv.obj: cpl_serv.c
        $(CC) -c $(CFLAGS) cpl_serv.c
    
    clean:
        -del *.obj
        -del *.exe
        -del *.lib
        -del *.dll
        -del *.manifest
    
    install:    all
        -mkdir $(PREFIX)
        -mkdir $(BINDIR)
        -mkdir $(DATADIR)
        copy *.dll $(BINDIR)
        copy *.exe $(BINDIR)
        -copy csv\*.csv $(DATADIR)    
    
    devinstall:    install
        -mkdir $(INCDIR)
        -mkdir $(LIBDIR)
        copy *.lib $(LIBDIR)
        copy *.h $(INCDIR)
        copy libxtiff\*.h $(INCDIR)
        copy *.inc $(INCDIR)
        
    

  5. Save and close the text editor.

  6. Open up the Win64 Command Prompt if it is not on the screen.
  7. In the Command Prompt, type in the following.

    C:\> cd \Work\src\libgeotiff-1.4.0\
  8. Run the nmake build command in the Command Prompt.

    C:\> nmake /f makefile.vc
    The 64 bit libgeotiff files are created.

Monday, February 25, 2013

HTML5 Picture Text WebApp for making social network picture status message

Using HTML5 and a great Canvas Javascript library Fabricjs, I made a simple web app for placing text string on images for sharing on social networks like Facebook, Google+ or Twitter. One or more text strings can be placed on the canvas. Once placed, the text can be edited, rotated, scaled, stretched or styled with different fonts and stroked. The background can be a plain color fill or a user defined image - the image can be set with some opacity value.

To run the web app, go to http://dominoc925-pages.appspot.com/webapp/picture_text/default.html.



Change the canvas
  1. On the right pane, click Settings.


  2. In the Canvas width field, type in a new width (in pixels) e.g. 800.
  3. In the Canvas height field, type in a new height (in pixels) e.g. 600.
  4. In the Canvas fill color field, pick a new background color e.g. grey.
  5. To use an image for the background, choose Image in the Background combo box.

    Additional fields appear.

  6. Click the Choose File button. Choose an image.

    The image is displayed in the canvas.

  7. To change the image opacity, type in a value between 0 and 1 in the Background image opacity field.

Placing text

  1. On the right pane, click Add new text.

    The Add text dialog appears.

  2. Type in any text string in the Text string field.
  3. Optional. Choose a font, font style, effects, line spacing, text alignment, text fill color from the various combo boxes.
  4. Click Okay.

    The text string is placed randomly on the canvas.

  5. Close the dialog.
Move, rotate, resize, stretch the text
  1. Select the text string on the canvas.

    Handles appear around the text string.
  2. To move the text, just drag it to a new location.
  3. To resize the text, just press down SHIFT and drag the corner handles (four sided arrow cursor).
  4. To rotate the text, just drag the corner handles (diagonal double headed arrow cursor).


  5. To stretch the text, just drag the side handles (vertical or horizontal double headed arrow cursor). 
Changing the text properties
  1. Select the text string on the canvas.

    The Properties and Delete buttons appear on the right pane.

  2. On the right pane, click Properties.

    The Update text dialog appears.

  3. To change the text string, just type in new text in the Text string field.
  4. To change the font, style, effects, line spacing, or text alignment, use the combo boxes.
  5. To change the text fill color, just pick another color in the Text fill color picker field.
  6. To apply a stroke around the text, toggle on Stroke text. Then choose a color from the Text stroke color picker field. Choose a text stroke width in the Text stroke width field.
  7. Click Okay.

    The text string is updated.

  8. Close the dialog.
Creating the picture text image file
  1. On the right pane, click Export image.

    The text is composited with the background and a new window of the PNG image pops up.
  2. Right click on the image. Choose Save image as.


  3. Type in a file name and save the image.

Monday, February 18, 2013

Example KML for displaying extended data in balloons

In Google Earth, it is possible to display a nicely formatted Placemark balloon showing some relevant information about that Placemark. The simplest way to create the Placemark KML is to write and format everything (including the HTML mark ups) in the Placemark's Description tag, as shown in the example code below.
<Placemark>
<name>Microsoft</name>
<description>
<![CDATA[
<b>Example 1</b>
<table border="1" >
<tr><td>Company Name</td></tr>
<tr><td><i>Microsoft</i></td></tr>
</table>
]]>
</description>
<Point> <coordinates>-122.034924,37.331586,0</coordinates>
</Point>
</Placemark>

The screenshot shows how it is displayed in Google Earth.

However, if there are a lot of Placemarks, it would be a pain to have write the mark up and data values for everyone. It would be better to define a custom balloon style containing a template HTML mark up and placeholders for the variable data values once; the data values would then be stored under the Placemark's ExtendedData tag. When Google Earth renders the Placemark balloons, it would use the referenced balloon style and replace the placeholders with the actual data values from the Placemark's ExtendedData tags.

The example code below defines a balloon style with a placeholder $[Company_Name] in the HTML mark up text.
<Style id="MyBalloonStyle">
<BalloonStyle>
<text> <![CDATA[
<b>Example extended data template</b>
<table border="1" >
<tr><td>Company Name</td></tr>
<tr><td><i>$[Company_Name]</i></td></tr>
</table>
]]></text>
<bgColor>ffffffbb</bgColor>
</BalloonStyle>

Then in the Placemark tag, it is only necessary to place the data (name and value) under the ExtendedData tag as shown below. The balloon style is referenced with the StyleUrl tag.
<Placemark>
<name>Apple</name>
<styleUrl>#MyBalloonStyle</styleUrl>
<ExtendedData>
<Data name="Company_Name"><value>Apple Incorporated</value></Data>
</ExtendedData>
<Point> <coordinates>-122.034924,37.331586,0</coordinates>
</Point>
</Placemark>

The full KML code is shown below.


<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
 
<Style id="MyBalloonStyle">
<BalloonStyle>
<text> <![CDATA[
<b>Example extended data template</b>
<table border="1" >
<tr><td>Company Name</td></tr>
<tr><td><i>$[Company_Name]</i></td></tr>
</table>
]]></text>
<bgColor>ffffffbb</bgColor>
</BalloonStyle>
<IconStyle> <color>ffffffff</color> <scale>1</scale>
<Icon><href>http://maps.google.com/mapfiles/kml/pushpin/grn-pushpin.png</href>
</Icon>
</IconStyle>
<LabelStyle> <scale>0</scale> </LabelStyle>
</Style>
<Folder> <name>Tech Companies</name>
<Placemark>
<name>Apple</name>
<styleUrl>#MyBalloonStyle</styleUrl>
<ExtendedData>
<Data name="Company_Name"><value>Apple Incorporated</value></Data>
</ExtendedData>
<Point> <coordinates>-122.034924,37.331586,0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Google</name>
<styleUrl>#MyBalloonStyle</styleUrl>
<ExtendedData>
<Data name="Company_Name"><value>Google Incorporated</value></Data>
</ExtendedData>
<Point> <coordinates>-122.084676,37.421742,0</coordinates>
</Point>
</Placemark>
</Folder>
</Document>
</kml>

The screenshot shows how it is rendered in Google Earth.

Monday, February 11, 2013

Example KML for displaying a photo image from the local disk

Recently I had to generate some Google Earth KML files for displaying photos from a local hard drive in a Placemark balloon. In order to display local images not from a web server, the file keyword must be used with 3 forward slashes in the HTML img tag followed by the full path of the photo file, as shown in the example KML code below.

 <?xml version="1.0" encoding="utf-8"?>  
 <kml>  
  <Document>  
   <name>Example of displaying a local image file</name>  
   <Placemark>  
    <name>Monaco</name>  
    <Snippet>Photo 1</Snippet>  
    <description><![CDATA[  
 <img src='file:///c:\temp\monaco\IMG_5523.jpg' width='400' /><br/&gt;  
 Photo taken from near the palace in Monaco<br/>  
 ]]>  
 </description>  
    <Point>  
     <coordinates>7.421630,43.731459</coordinates>  
    </Point>  
   </Placemark>  
  </Document>  
 </kml>  
The following screenshots show how this KML file is rendered in Google Earth.
 When the Placemark is clicked, the balloon pops up showing the local photo image file.