Java-MapInfo ile Integrated Mapping

Daha önce birkaç kez internette Java ve MapInfo ile integrated mapping uygulaması yapan var mıdır diye merak edip araştırma yapmıştım. Fakat sonuç her seferinde olumsuzdu. Kendi kendime “Koca dünyada bu ikiliyi kullanan bir Allah’ın kulu yok mu?” diye hayret içinde kalıyordum. Daha önce Java-MapInfo ikilisinin nasıl kullanılacağına dair az çok fikrim vardı. Mesela bu işin  JNI (Java Native Interface) kullanarak yapılabileceğini biliyordum ama uygulamanın kolay olmayacağı muhtemeldi. Ben de geçenlerde bu denemeyi kendi kendime yapmaya karar verdim ve sonunda Java ile MapInfo’yu konuşturmak mümkün oldu.

Peki Java-MapInfo ile integrated mapping yapmak neden kolay değil? Öncelikle Java, tasarımı gereği platform bağımsız bir dil. Dolayısıyla Windows’a özgü birçok özelliği direkt olarak desteklemiyor. Windows’a özgü özelliklerden biri de Microsoft’un COM ve OLE Otomasyonu teknolojileri olduğu için, Java’nın bu teknolojilerin kullanıldığı alanlarda kullanışlı olduğunu söylemek tabii ki mümkün değil. Şimdiye kadar MapInfo kullanarak yazdığımız integrated mapping uygulamalarında çoğunlukla Visual Basic, Delphi, MS Visual C++, C# veya VB.NET kullandık. Bunların hepsinin ortak özelliği Windows platformuna ait geliştirme ortamları olmaları, built-in olarak COM ve OLE desteği vermeleri ve Windows API lerini doğrudan kullanabilmeleri. Dolayısıyla bunları kullanarak integrated mapping uygulamaları yazmak hem nispeten kolay hem de zevklidir. Ama Java için durum biraz farklıdır.

Java-MapInfo ile integrated mapping yaparken temelde karşımıza çıkan 2 önemli engel var diyebiliriz:

1) Java’nın COM teknolojisini doğrudan desteklememesi.

2) Java ile Windows API lerini doğrudan çağırmanın mümkün olmaması.

Birinci maddenin anlamı şudur: Mesela Visual Studio (VB 6.0, C#, VB.NET gibi) ile integrated mapping yaparken önce proje referanslarına MapInfo’yu ekleriz. İşte bu durum Visual Studio dillerinin COM desteğini otomatik olarak vermesinin bir sonucu. Ama Java ile yazarken böyle bir seçeneğimiz yok. Bu yüzden Java’da daha alt seviye bir çözüm bulmamız gerekiyor.

İkinci maddeyle kastettiğimiz ise şu: Yine Java’nın platform bağımsız doğasının sonucu olarak Windows API lerine doğrudan erişemiyoruz. “-Peki Windows API lerine niye ihtiyacımız var?” derseniz: Harita penceresinin OnResize olayında haritayı pencereye uydurmak için MoveWindow Windows API sini kullanmamız gerekiyor. Yani yine alt seviye bir çözüm lazım!

Birinci engeli aşmak için JACOB (Java-COM Bridge) adlı bir açık kaynaklı kütüphane kullandım. JACOB, adından da anlaşılacağı üzere, JNI kullanarak COM bileşenlerine ve Windows kütüphanelerine native çağrılar yapabilen bir Java-COM köprüsüdür. Adresi:

http://danadler.com/jacob/

Yani JACOB kullanarak yeni bir MapInfo örneği oluşturmak (VB6 daki CreateObject() metodunun yaptığı gibi) ve bundan sonra

mapinfo.Do()

ve

mapinfo.Eval()

gibi çağrıları yaparak MapInfo’yu kontrol etmek mümkün oldu.

İkinci engeli aşmak, yani Windows API lerini Java’dan çağırabilmek için ise JaWin (Java/Win32 integration) adlı açık kaynaklı bir kütüphaneyi kullandım. Adresi:

http://jawinproject.sourceforge.net/

Aslında bu kütüphanelerden sadece biri sanıyorum yeterli olacaktı fakat COM etkileşimi için JACOB, Windows API si çağırmak için ise JaWin kullanmak daha çok işime geldi.

Geliştirme ile ilgili paylaşmak istediğim bir diğer husus: Daha önce integrated mapping uygulamalarında haritayı göstermek için harita formunun kendisini değil de, picturebox veya panel gibi bir bileşen kullanıyordum. Fakat bir Java Swing uygulamasında (ekteki örnek bir Swing uygulaması) bunun mümkün olmadığını gördüm çünkü Swing bileşenleri %100 Java ile yazılmış “lightweight“ bileşenler olduğu için bu bileşenlere ait handle (HWND) değerleri mevcut olmuyor. Ama Swing formlarında (Java dilinde JFrame deniyor) bu durum söz konusu değil, yani Swing formlarının handle değerlerini alabiliyoruz. Bu yüzden haritayı Swing formunda göstermek zorunda kaldım. Eğer kullanıcı arayüzlerinde Swing yerine AWT kullanırsanız böyle bir problem olmayacak çünkü AWT bileşenlerine “heavyweight” bileşenler deniyor ve bu bileşenlere ait handle değerleri mevcut oluyor.

Sonuç olarak Java-MapInfo ile integrated mapping uygulamasını yapabilmiş olmakla beraber, kullanışlı ve tavsiye edilebilir bir seçenek olduğunu söylemek mümkün değil. Bence profesyonel anlamda veya bir proje kapsamında MapInfo ile integrated mapping geliştiren arkadaşlar diğer dillerden şaşmasın. Bu konuda benim favorim C# + MapInfo ikilisidir. (VB.NET de iyi bir seçim tabi) Ama üniversitede dil olarak Java dersi alan veya  Java-MapInfo ikilisini merak eden arkadaşlar için ekteki örnek uygulama belki faydalı olabilir.

Not: Örnek uygulamayı Eclipse 3.5 (Galileo) ile yazdım.

Örnek Java projesini aşağıdaki linkten indirebilirsiniz:

https://dl.dropboxusercontent.com/u/54151940/GIS/MapInfo/IntegratedMapping/JavaMapInfoOLE.rar

Advertisements
  1. No comments yet.
  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: